diff options
author | Simon Riggs <simon@2ndQuadrant.com> | 2017-03-22 16:37:28 +0000 |
---|---|---|
committer | Simon Riggs <simon@2ndQuadrant.com> | 2017-03-22 16:37:28 +0000 |
commit | 49bff5300d527f28c7670cdfad9e4a1b8f5ccdea (patch) | |
tree | 530d5551e9f62f605f5791bdeade19d59ae0a09f /src | |
parent | 8df9bd0b445f9bd6134915d4417efde6e85e3add (diff) | |
download | postgresql-49bff5300d527f28c7670cdfad9e4a1b8f5ccdea.tar.gz postgresql-49bff5300d527f28c7670cdfad9e4a1b8f5ccdea.zip |
Assign AccessExclusiveLocks against subxacts in Hot Standby
Previously AELs were registered against the top-level xid, which could
cause locks to be held much longer than necessary in some cases during
Hot Standby replay. We now record locks directly against their appropriate
xids. Requires few code changes because original code allowed for this
situation but didn’t fully implement it.
Discussion: CAKJS1f9vJ841HY=wonnLVbfkTWGYWdPN72VMxnArcGCjF3SywA@mail.gmail.com
Author: Simon Riggs and David Rowley
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/storage/ipc/standby.c | 8 |
1 files changed, 2 insertions, 6 deletions
diff --git a/src/backend/storage/ipc/standby.c b/src/backend/storage/ipc/standby.c index 7be8fd4a784..8e57f933cab 100644 --- a/src/backend/storage/ipc/standby.c +++ b/src/backend/storage/ipc/standby.c @@ -590,10 +590,6 @@ StandbyLockTimeoutHandler(void) * RelationLockList, so we can keep track of the various entries made by * the Startup process's virtual xid in the shared lock table. * - * We record the lock against the top-level xid, rather than individual - * subtransaction xids. This means AccessExclusiveLocks held by aborted - * subtransactions are not released as early as possible on standbys. - * * List elements use type xl_rel_lock, since the WAL record type exactly * matches the information that we need to keep track of. * @@ -1052,7 +1048,7 @@ LogAccessExclusiveLock(Oid dbOid, Oid relOid) { xl_standby_lock xlrec; - xlrec.xid = GetTopTransactionId(); + xlrec.xid = GetCurrentTransactionId(); /* * Decode the locktag back to the original values, to avoid sending lots @@ -1084,7 +1080,7 @@ LogAccessExclusiveLockPrepare(void) * GetRunningTransactionLocks() might see a lock associated with an * InvalidTransactionId which we later assert cannot happen. */ - (void) GetTopTransactionId(); + (void) GetCurrentTransactionId(); } /* |