diff options
Diffstat (limited to 'src/backend')
| -rw-r--r-- | src/backend/storage/ipc/standby.c | 9 | ||||
| -rw-r--r-- | src/backend/storage/lmgr/lmgr.c | 18 |
2 files changed, 26 insertions, 1 deletions
diff --git a/src/backend/storage/ipc/standby.c b/src/backend/storage/ipc/standby.c index df9a9a495b6..9d0c27219b9 100644 --- a/src/backend/storage/ipc/standby.c +++ b/src/backend/storage/ipc/standby.c @@ -82,7 +82,7 @@ InitRecoveryTransactionEnvironment(void) * hold AccessShareLocks so never block while we write or lock new rows. */ vxid.backendId = MyBackendId; - vxid.localTransactionId = GetNextLocalTransactionId(); + vxid.localTransactionId = MyProc->lxid = GetNextLocalTransactionId(); VirtualXactLockTableInsert(vxid); standbyState = STANDBY_INITIALIZED; @@ -98,11 +98,18 @@ InitRecoveryTransactionEnvironment(void) void ShutdownRecoveryTransactionEnvironment(void) { + VirtualTransactionId vxid; + /* Mark all tracked in-progress transactions as finished. */ ExpireAllKnownAssignedTransactionIds(); /* Release all locks the tracked transactions were holding */ StandbyReleaseAllLocks(); + + /* Cleanup our VirtualTransaction */ + vxid.backendId = MyBackendId; + vxid.localTransactionId = MyProc->lxid; + VirtualXactLockTableDelete(vxid); } diff --git a/src/backend/storage/lmgr/lmgr.c b/src/backend/storage/lmgr/lmgr.c index 75f2f2666e0..9a41d47fbbf 100644 --- a/src/backend/storage/lmgr/lmgr.c +++ b/src/backend/storage/lmgr/lmgr.c @@ -535,6 +535,24 @@ VirtualXactLockTableInsert(VirtualTransactionId vxid) } /* + * VirtualXactLockTableDelete + * + * Release a Virtual Transaction lock. Only called by Startup process + * at end of Hot Standby. + */ +void +VirtualXactLockTableDelete(VirtualTransactionId vxid) +{ + LOCKTAG tag; + + Assert(VirtualTransactionIdIsValid(vxid)); + + SET_LOCKTAG_VIRTUALTRANSACTION(tag, vxid); + + (void) LockRelease(&tag, ExclusiveLock, false); +} + +/* * VirtualXactLockTableWait * * Waits until the lock on the given VXID is released, which shows that |
