aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlvaro Herrera <alvherre@alvh.no-ip.org>2008-01-23 15:36:38 +0000
committerAlvaro Herrera <alvherre@alvh.no-ip.org>2008-01-23 15:36:38 +0000
commit8984c8bbe237d16204019c2803343dc6d16a9d0e (patch)
tree09914da6a3a7281106a8cc67f3c1e717d4dc364f /src
parent6a7a63d3a35ba47bc291cb4e419d1814b43fcf47 (diff)
downloadpostgresql-8984c8bbe237d16204019c2803343dc6d16a9d0e.tar.gz
postgresql-8984c8bbe237d16204019c2803343dc6d16a9d0e.zip
Improve lock level choices in pg_shdepend.c. Noticed by Tom Lane.
Diffstat (limited to 'src')
-rw-r--r--src/backend/catalog/pg_shdepend.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/src/backend/catalog/pg_shdepend.c b/src/backend/catalog/pg_shdepend.c
index dd326648ec2..be37d628ae4 100644
--- a/src/backend/catalog/pg_shdepend.c
+++ b/src/backend/catalog/pg_shdepend.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/catalog/pg_shdepend.c,v 1.22 2008/01/01 19:45:48 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/catalog/pg_shdepend.c,v 1.23 2008/01/23 15:36:38 alvherre Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1110,7 +1110,12 @@ shdepDropOwned(List *roleids, DropBehavior behavior)
deleteobjs = new_object_addresses();
- sdepRel = heap_open(SharedDependRelationId, AccessExclusiveLock);
+ /*
+ * We don't need this strong a lock here, but we'll call routines that
+ * acquire RowExclusiveLock. Better get that right now to avoid potential
+ * deadlock failures.
+ */
+ sdepRel = heap_open(SharedDependRelationId, RowExclusiveLock);
/*
* For each role, find the dependent objects and drop them using the
@@ -1224,7 +1229,7 @@ shdepDropOwned(List *roleids, DropBehavior behavior)
/* the dependency mechanism does the actual work */
performMultipleDeletions(deleteobjs, behavior);
- heap_close(sdepRel, AccessExclusiveLock);
+ heap_close(sdepRel, RowExclusiveLock);
free_object_addresses(deleteobjs);
}
@@ -1241,7 +1246,12 @@ shdepReassignOwned(List *roleids, Oid newrole)
Relation sdepRel;
ListCell *cell;
- sdepRel = heap_open(SharedDependRelationId, AccessShareLock);
+ /*
+ * We don't need this strong a lock here, but we'll call routines that
+ * acquire RowExclusiveLock. Better get that right now to avoid potential
+ * deadlock problems.
+ */
+ sdepRel = heap_open(SharedDependRelationId, RowExclusiveLock);
foreach(cell, roleids)
{
@@ -1343,5 +1353,5 @@ shdepReassignOwned(List *roleids, Oid newrole)
systable_endscan(scan);
}
- heap_close(sdepRel, AccessShareLock);
+ heap_close(sdepRel, RowExclusiveLock);
}