pgsql: It turns out that TablespaceCreateDbspace fails badly if a
От | tgl@postgresql.org (Tom Lane) |
---|---|
Тема | pgsql: It turns out that TablespaceCreateDbspace fails badly if a |
Дата | |
Msg-id | 20060119044547.A3A229DC9F0@postgresql.org обсуждение исходный текст |
Список | pgsql-committers |
Log Message: ----------- It turns out that TablespaceCreateDbspace fails badly if a relcache flush occurs when it tries to heap_open pg_tablespace. When control returns to smgrcreate, that routine will be holding a dangling pointer to a closed SMgrRelation, resulting in mayhem. This is of course a consequence of the violation of proper module layering inherent in having smgr.c call a tablespace command routine, but the simplest fix seems to be to change the locking mechanism. There's no real need for TablespaceCreateDbspace to touch pg_tablespace at all --- it's only opening it as a way of locking against a parallel DROP TABLESPACE command. A much better answer is to create a special-purpose LWLock to interlock these two operations. This drops TablespaceCreateDbspace quite a few layers down the food chain and makes it something reasonably safe for smgr to call. Tags: ---- REL8_1_STABLE Modified Files: -------------- pgsql/src/backend/commands: tablespace.c (r1.28 -> r1.28.2.1) (http://developer.postgresql.org/cvsweb.cgi/pgsql/src/backend/commands/tablespace.c.diff?r1=1.28&r2=1.28.2.1) pgsql/src/include/storage: lwlock.h (r1.23 -> r1.23.2.1) (http://developer.postgresql.org/cvsweb.cgi/pgsql/src/include/storage/lwlock.h.diff?r1=1.23&r2=1.23.2.1)
В списке pgsql-committers по дате отправления: