Thread: pgsql: It turns out that TablespaceCreateDbspace fails badly if a
pgsql: It turns out that TablespaceCreateDbspace fails badly if a
From
tgl@postgresql.org (Tom Lane)
Date:
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_0_STABLE Modified Files: -------------- pgsql/src/backend/commands: tablespace.c (r1.15 -> r1.15.4.1) (http://developer.postgresql.org/cvsweb.cgi/pgsql/src/backend/commands/tablespace.c.diff?r1=1.15&r2=1.15.4.1) pgsql/src/include/storage: lwlock.h (r1.16 -> r1.16.4.1) (http://developer.postgresql.org/cvsweb.cgi/pgsql/src/include/storage/lwlock.h.diff?r1=1.16&r2=1.16.4.1)