BUG #3833: Index remains when table is dropped

Started by Laurenz Albeover 18 years ago7 messagesbugs
Jump to latest
#1Laurenz Albe
laurenz.albe@cybertec.at

The following bug has been logged online:

Bug reference: 3833
Logged by: Laurenz Albe
Email address: laurenz.albe@wien.gv.at
PostgreSQL version: 8.2.5
Operating system: RedHat Enterprise Linux 3
Description: Index remains when table is dropped
Details:

Two concurrent sessions perform statements against one database. The
sessions are named s1 and s2 in this example.

s1=> CREATE TABLE x(i integer);

s2=> BEGIN;
s2=> CREATE UNIQUE INDEX x_pkey ON x(i);

s1=> DROP TABLE x;
(Session hangs)

s2=> COMMIT;

Now Session s1 will unblock and succeed in dropping the table. The index,
however, remains in pg_class, pg_depend, and pg_index.

"DROP INDEX x_pkey" will lead to an error like this:
ERROR: could not open relation with OID 65615
The OID here is the one of the dropped table.

#2Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Laurenz Albe (#1)
Re: BUG #3833: Index remains when table is dropped

Laurenz Albe wrote:

Two concurrent sessions perform statements against one database. The
sessions are named s1 and s2 in this example.

s1=> CREATE TABLE x(i integer);

s2=> BEGIN;
s2=> CREATE UNIQUE INDEX x_pkey ON x(i);

s1=> DROP TABLE x;
(Session hangs)

s2=> COMMIT;

Now Session s1 will unblock and succeed in dropping the table. The index,
however, remains in pg_class, pg_depend, and pg_index.

Hmm. So this is the bug that Tom mentioned on race conditions on
pg_depend. Interesting. I think the solution is to add more strict
locking when registering stuff in pg_depend, like the pg_shdepend code
does.

--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.

#3Tom Lane
tgl@sss.pgh.pa.us
In reply to: Alvaro Herrera (#2)
Re: BUG #3833: Index remains when table is dropped

Alvaro Herrera <alvherre@commandprompt.com> writes:

Hmm. So this is the bug that Tom mentioned on race conditions on
pg_depend.

Yeah, I think it's a variant of the problem we've seen before:
http://archives.postgresql.org/pgsql-bugs/2007-03/msg00144.php

Still no nice ideas about how to fix it.

regards, tom lane

#4Mark Kirkwood
mark.kirkwood@catalyst.net.nz
In reply to: Tom Lane (#3)
Re: BUG #3833: Index remains when table is dropped

I encountered this bug recently - and thought I'd have a try at seeing
what might fix it.

Taking an exclusive lock on the to-be-dropped table immediately (i.e in
RemoveRel) seems to be enough to prevent the drop starting while an
index is being created in another session. So it "fixes" the issue -
possible objections that I can think of are:

1/ Not a general solution to multi session dependent drop/create of
objects other than tables (unless we do 2/)
2/ Using this approach in all object dropping code may result in
deadlocks (but is this worse than dangling/mangled objects?)

Now, I'm conscious that there could be other show stopper reasons for
*not* doing this that I have not thought of, but figured I'd post in
case the idea was useful. Thoughts?

Cheers

Mark

Attachments:

tablecmds.c.patchtext/x-patch; name=tablecmds.c.patchDownload+3-0
#5Bruce Momjian
bruce@momjian.us
In reply to: Mark Kirkwood (#4)
Re: BUG #3833: Index remains when table is dropped

Your patch has been added to the PostgreSQL unapplied patches list at:

http://momjian.postgresql.org/cgi-bin/pgpatches

It will be applied as soon as one of the PostgreSQL committers reviews
and approves it.

---------------------------------------------------------------------------

Mark Kirkwood wrote:

I encountered this bug recently - and thought I'd have a try at seeing
what might fix it.

Taking an exclusive lock on the to-be-dropped table immediately (i.e in
RemoveRel) seems to be enough to prevent the drop starting while an
index is being created in another session. So it "fixes" the issue -
possible objections that I can think of are:

1/ Not a general solution to multi session dependent drop/create of
objects other than tables (unless we do 2/)
2/ Using this approach in all object dropping code may result in
deadlocks (but is this worse than dangling/mangled objects?)

Now, I'm conscious that there could be other show stopper reasons for
*not* doing this that I have not thought of, but figured I'd post in
case the idea was useful. Thoughts?

Cheers

Mark

---------------------------(end of broadcast)---------------------------
TIP 1: if posting/reading through Usenet, please send an appropriate
subscribe-nomail command to majordomo@postgresql.org so that your
message can get through to the mailing list cleanly

--
Bruce Momjian <bruce@momjian.us> http://momjian.us
EnterpriseDB http://postgres.enterprisedb.com

+ If your life is a hard drive, Christ can be your backup. +

#6Bruce Momjian
bruce@momjian.us
In reply to: Mark Kirkwood (#4)
Re: BUG #3833: Index remains when table is dropped

The comment I have from Tom Lane on this patch is:

band-aid solution to just one aspect of problem ...

so I am afraid I am going to have to reject it. Sorry.

---------------------------------------------------------------------------

Mark Kirkwood wrote:

I encountered this bug recently - and thought I'd have a try at seeing
what might fix it.

Taking an exclusive lock on the to-be-dropped table immediately (i.e in
RemoveRel) seems to be enough to prevent the drop starting while an
index is being created in another session. So it "fixes" the issue -
possible objections that I can think of are:

1/ Not a general solution to multi session dependent drop/create of
objects other than tables (unless we do 2/)
2/ Using this approach in all object dropping code may result in
deadlocks (but is this worse than dangling/mangled objects?)

Now, I'm conscious that there could be other show stopper reasons for
*not* doing this that I have not thought of, but figured I'd post in
case the idea was useful. Thoughts?

Cheers

Mark

[ text/x-patch is unsupported, treating like TEXT/PLAIN ]

*** src/backend/commands/tablecmds.c.orig	Wed Jan  2 13:58:05 2008
--- src/backend/commands/tablecmds.c	Wed Jan  2 13:46:43 2008
***************
*** 514,519 ****
--- 514,522 ----
object.objectId = relOid;
object.objectSubId = 0;
+ 	//Try a lock here!
+ 	LockRelationOid(relOid, ExclusiveLock);
+ 
performDeletion(&object, behavior);
}

---------------------------(end of broadcast)---------------------------
TIP 1: if posting/reading through Usenet, please send an appropriate
subscribe-nomail command to majordomo@postgresql.org so that your
message can get through to the mailing list cleanly

--
Bruce Momjian <bruce@momjian.us> http://momjian.us
EnterpriseDB http://postgres.enterprisedb.com

+ If your life is a hard drive, Christ can be your backup. +

#7Mark Kirkwood
mark.kirkwood@catalyst.net.nz
In reply to: Bruce Momjian (#6)
Re: BUG #3833: Index remains when table is dropped

Bruce Momjian wrote:

The comment I have from Tom Lane on this patch is:

band-aid solution to just one aspect of problem ...

so I am afraid I am going to have to reject it. Sorry.

No problem, thanks for passing along the feedback - I was primarily
interested in that (as I figured there was probably a reason why this
had not been tried!).

Best wishes

Mark