Skip to content

Commit 8f0de71

Browse files
committed
Don't ignore locktable-full failures in StandbyAcquireAccessExclusiveLock.
Commit 37c5486 removed the code in StandbyAcquireAccessExclusiveLock that checked the return value of LockAcquireExtended. That created a bug, because it's still passing reportMemoryError = false to LockAcquireExtended, meaning that LOCKACQUIRE_NOT_AVAIL will be returned if we're out of shared memory for the lock table. In such a situation, the startup process would believe it had acquired an exclusive lock even though it hadn't, with potentially dire consequences. To fix, just drop the use of reportMemoryError = false, which allows us to simplify the call into a plain LockAcquire(). It's unclear that the locktable-full situation arises often enough that it's worth having a better recovery method than crash-and-restart. (I strongly suspect that the only reason the code path existed at all was that it was relatively simple to do in the pre-37c54863c implementation. But now it's not.) LockAcquireExtended's reportMemoryError parameter is now dead code and could be removed. I refrained from doing so, however, because there was some interest in resurrecting the behavior if we do get reports of locktable-full failures in the field. Also, it seems unwise to remove the parameter concurrently with shipping commit f868a81, which added a parameter; if there are any third-party callers of LockAcquireExtended, we want them to get a wrong-number-of-parameters compile error rather than a possibly-silent misinterpretation of its last parameter. Back-patch to 9.6 where the bug was introduced. Discussion: https://postgr.es/m/6202.1536359835@sss.pgh.pa.us
1 parent 2a63683 commit 8f0de71

File tree

2 files changed

+8
-7
lines changed

2 files changed

+8
-7
lines changed

src/backend/storage/ipc/standby.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -661,8 +661,7 @@ StandbyAcquireAccessExclusiveLock(TransactionId xid, Oid dbOid, Oid relOid)
661661

662662
SET_LOCKTAG_RELATION(locktag, newlock->dbOid, newlock->relOid);
663663

664-
(void) LockAcquireExtended(&locktag, AccessExclusiveLock, true, false,
665-
false, NULL);
664+
(void) LockAcquire(&locktag, AccessExclusiveLock, true, false);
666665
}
667666

668667
static void

src/backend/storage/lmgr/lock.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -693,11 +693,13 @@ LockAcquire(const LOCKTAG *locktag,
693693
/*
694694
* LockAcquireExtended - allows us to specify additional options
695695
*
696-
* reportMemoryError specifies whether a lock request that fills the
697-
* lock table should generate an ERROR or not. This allows a priority
698-
* caller to note that the lock table is full and then begin taking
699-
* extreme action to reduce the number of other lock holders before
700-
* retrying the action.
696+
* reportMemoryError specifies whether a lock request that fills the lock
697+
* table should generate an ERROR or not. Passing "false" allows the caller
698+
* to attempt to recover from lock-table-full situations, perhaps by forcibly
699+
* cancelling other lock holders and then retrying. Note, however, that the
700+
* return code for that is LOCKACQUIRE_NOT_AVAIL, so that it's unsafe to use
701+
* in combination with dontWait = true, as the cause of failure couldn't be
702+
* distinguished.
701703
*
702704
* If locallockp isn't NULL, *locallockp receives a pointer to the LOCALLOCK
703705
* table entry if a lock is successfully acquired, or NULL if not.

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy