postgres.git / summary / log / commit / refs

commit    f4a3e679306ebfbd150d8af3cdd481bea1619c52
Author:   Simon Riggs <simon@2ndQuadrant.com>
Date:     Thu Nov 29 23:46:54 2012 +0000

    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 ++++++++- src/backend/storage/lmgr/lmgr.c | 18 ++++++++++++++++++ src/include/storage/lmgr.h | 1 + 3 files changed, 27 insertions(+), 1 deletion(-) 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 @@ -534,6 +534,24 @@ VirtualXactLockTableInsert(VirtualTransactionId vxid) (void) LockAcquire(&tag, ExclusiveLock, false, false); } +/* + * 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 * diff --git a/src/include/storage/lmgr.h b/src/include/storage/lmgr.h index 64b19e334c7..e40dcb6fe7e 100644 --- a/src/include/storage/lmgr.h +++ b/src/include/storage/lmgr.h @@ -58,6 +58,7 @@ extern bool ConditionalXactLockTableWait(TransactionId xid); /* Lock a VXID (used to wait for a transaction to finish) */ extern void VirtualXactLockTableInsert(VirtualTransactionId vxid); +extern void VirtualXactLockTableDelete(VirtualTransactionId vxid); extern void VirtualXactLockTableWait(VirtualTransactionId vxid); extern bool ConditionalVirtualXactLockTableWait(VirtualTransactionId vxid); [parent: 1dbd02dc37ef]