Skip to content

Commit 111cfda

Browse files
committed
Put back AcceptInvalidationMessages calls in heap_openrv(_extended).
These calls were removed in commit 4240e42 as part of a general refactoring and improvement of DDL locking. However, there's a problem not solved by the rewrite, which is that GRANT/REVOKE update pg_class.relacl without taking any particular lock on the target table as such. If another backend fails to do AcceptInvalidationMessages, it won't notice a recently-committed change in ACLs. Bug #7557 from Piotr Czachur demonstrates that there's at least one code path in 9.2.0 in which a command fails to do any AcceptInvalidationMessages calls at all, if the current transaction already holds all the locks it will need. Since we're hard up against the release deadline for 9.2.1, fix this by putting back the AcceptInvalidationMessages calls in heap_openrv and heap_openrv_extended, thereby restoring the historical behavior in this area. We ought to look for a more elegant and perhaps more bulletproof solution, but there's no time for that right now.
1 parent 67641fb commit 111cfda

File tree

1 file changed

+21
-0
lines changed

1 file changed

+21
-0
lines changed

src/backend/access/heap/heapam.c

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -985,6 +985,20 @@ relation_openrv(const RangeVar *relation, LOCKMODE lockmode)
985985
{
986986
Oid relOid;
987987

988+
/*
989+
* Check for shared-cache-inval messages before trying to open the
990+
* relation. This is needed even if we already hold a lock on the
991+
* relation, because GRANT/REVOKE are executed without taking any lock on
992+
* the target relation, and we want to be sure we see current ACL
993+
* information. We can skip this if asked for NoLock, on the assumption
994+
* that such a call is not the first one in the current command, and so we
995+
* should be reasonably up-to-date already. (XXX this all could stand to
996+
* be redesigned, but for the moment we'll keep doing this like it's been
997+
* done historically.)
998+
*/
999+
if (lockmode != NoLock)
1000+
AcceptInvalidationMessages();
1001+
9881002
/* Look up and lock the appropriate relation using namespace search */
9891003
relOid = RangeVarGetRelid(relation, lockmode, false);
9901004

@@ -1007,6 +1021,13 @@ relation_openrv_extended(const RangeVar *relation, LOCKMODE lockmode,
10071021
{
10081022
Oid relOid;
10091023

1024+
/*
1025+
* Check for shared-cache-inval messages before trying to open the
1026+
* relation. See comments in relation_openrv().
1027+
*/
1028+
if (lockmode != NoLock)
1029+
AcceptInvalidationMessages();
1030+
10101031
/* Look up and lock the appropriate relation using namespace search */
10111032
relOid = RangeVarGetRelid(relation, lockmode, missing_ok);
10121033

0 commit comments

Comments
 (0)