Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Correctly init/deinit recovery xact environment.
authorSimon Riggs <simon@2ndQuadrant.com>
Thu, 29 Nov 2012 23:46:54 +0000 (23:46 +0000)
committerSimon Riggs <simon@2ndQuadrant.com>
Thu, 29 Nov 2012 23:46:54 +0000 (23:46 +0000)
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
src/backend/storage/lmgr/lmgr.c
src/include/storage/lmgr.h

index df9a9a495b66703e7892c1077e30e65fc695c356..9d0c27219b9c94b01c9312096311b4b17e774130 100644 (file)
@@ -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);
 }
 
 
index 75f2f2666e05e923f4d31a5e52b9de7b4dd3a892..9a41d47fbbfb4c8e882dbf6bc14c9e8e05fbe9fa 100644 (file)
@@ -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
  *
index 64b19e334c7eab19eb2b3db7380124917e220453..e40dcb6fe7ed2ce4cdbf6f0cea19437a55d896a2 100644 (file)
@@ -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);