diff options
author | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2008-01-23 15:36:38 +0000 |
---|---|---|
committer | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2008-01-23 15:36:38 +0000 |
commit | 8984c8bbe237d16204019c2803343dc6d16a9d0e (patch) | |
tree | 09914da6a3a7281106a8cc67f3c1e717d4dc364f /src | |
parent | 6a7a63d3a35ba47bc291cb4e419d1814b43fcf47 (diff) | |
download | postgresql-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.c | 20 |
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); } |