From 6f9a9da85c9015e773d12e8571c469e5a2a6b3fb Mon Sep 17 00:00:00 2001 From: Simon Riggs Date: Thu, 29 Nov 2012 23:52:17 +0000 Subject: Correctly init/deinit recovery xact environment. Previously we performed VirtualXactLockTableInsert but didn't set MyProc->lxid for Startup process. pg_locks now correctly shows "1/1" for vxid of Startup process during Hot Standby. At end of Hot Standby the Virtual Transaction was not deleted, leading to problems after promoting to normal running for some commands, such as CREATE INDEX CONCURRENTLY. --- src/backend/storage/ipc/standby.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'src/backend/storage/ipc') diff --git a/src/backend/storage/ipc/standby.c b/src/backend/storage/ipc/standby.c index fdec0eb2250..e1a9fbb7262 100644 --- a/src/backend/storage/ipc/standby.c +++ b/src/backend/storage/ipc/standby.c @@ -81,7 +81,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; @@ -97,11 +97,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); } -- cgit v1.2.3