summaryrefslogtreecommitdiff
path: root/src/include/storage
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2006-01-19 04:45:38 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2006-01-19 04:45:38 +0000
commit4513d9dedac634aeca41a436093bc02a1aa8efec (patch)
tree36a368426504d9a32e26db0f3913c382d1a6b7bb /src/include/storage
parentb0be247e38bdeb3911e70f5844bcbb48a1055917 (diff)
downloadpostgresql-4513d9dedac634aeca41a436093bc02a1aa8efec.tar.gz
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/storage')
-rw-r--r--src/include/storage/lwlock.h3
1 files changed, 2 insertions, 1 deletions
diff --git a/src/include/storage/lwlock.h b/src/include/storage/lwlock.h
index ca384218a5..fb05544db1 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.25 2006/01/04 21:06:32 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/storage/lwlock.h,v 1.26 2006/01/19 04:45:38 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -46,6 +46,7 @@ typedef enum LWLockId
RelCacheInitLock,
BgWriterCommLock,
TwoPhaseStateLock,
+ TablespaceCreateLock,
FirstLockMgrLock, /* must be last except for MaxDynamicLWLock */
MaxDynamicLWLock = 1000000000