* 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;
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);
}
(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
*
/* 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);