diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2006-01-19 04:45:47 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2006-01-19 04:45:47 +0000 |
commit | 7618330c6d205021a118c1994505be2ceaec25d6 (patch) | |
tree | a38905d438fd8d247a33933448b47081b94263fb /src/include | |
parent | 49a263011a3770846f612576d8d3408bc3fb8a58 (diff) | |
download | postgresql-7618330c6d205021a118c1994505be2ceaec25d6.tar.gz postgresql-7618330c6d205021a118c1994505be2ceaec25d6.zip |
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.
Diffstat (limited to 'src/include')
-rw-r--r-- | src/include/storage/lwlock.h | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/src/include/storage/lwlock.h b/src/include/storage/lwlock.h index 4291e0b2e74..1f2db284087 100644 --- a/src/include/storage/lwlock.h +++ b/src/include/storage/lwlock.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/storage/lwlock.h,v 1.23 2005/10/15 02:49:46 momjian Exp $ + * $PostgreSQL: pgsql/src/include/storage/lwlock.h,v 1.23.2.1 2006/01/19 04:45:47 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -46,6 +46,7 @@ typedef enum LWLockId RelCacheInitLock, BgWriterCommLock, TwoPhaseStateLock, + TablespaceCreateLock, NumFixedLWLocks, /* must be last except for MaxDynamicLWLock */ |