aboutsummaryrefslogtreecommitdiff
path: root/src/backend/storage/ipc/standby.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/storage/ipc/standby.c')
-rw-r--r--src/backend/storage/ipc/standby.c29
1 files changed, 21 insertions, 8 deletions
diff --git a/src/backend/storage/ipc/standby.c b/src/backend/storage/ipc/standby.c
index 82da9261566..5e0d1d067e5 100644
--- a/src/backend/storage/ipc/standby.c
+++ b/src/backend/storage/ipc/standby.c
@@ -953,14 +953,6 @@ LogAccessExclusiveLock(Oid dbOid, Oid relOid)
{
xl_standby_lock xlrec;
- /*
- * Ensure that a TransactionId has been assigned to this transaction. We
- * don't actually need the xid yet but if we don't do this then
- * RecordTransactionCommit() and RecordTransactionAbort() will optimise
- * away the transaction completion record which recovery relies upon to
- * release locks. It's a hack, but for a corner case not worth adding code
- * for into the main commit path.
- */
xlrec.xid = GetTopTransactionId();
/*
@@ -973,3 +965,24 @@ LogAccessExclusiveLock(Oid dbOid, Oid relOid)
LogAccessExclusiveLocks(1, &xlrec);
}
+
+/*
+ * Prepare to log an AccessExclusiveLock, for use during LockAcquire()
+ */
+void
+LogAccessExclusiveLockPrepare(void)
+{
+ /*
+ * Ensure that a TransactionId has been assigned to this transaction,
+ * for two reasons, both related to lock release on the standby.
+ * First, we must assign an xid so that RecordTransactionCommit() and
+ * RecordTransactionAbort() do not optimise away the transaction
+ * completion record which recovery relies upon to release locks. It's
+ * a hack, but for a corner case not worth adding code for into the
+ * main commit path. Second, must must assign an xid before the lock
+ * is recorded in shared memory, otherwise a concurrently executing
+ * GetRunningTransactionLocks() might see a lock associated with an
+ * InvalidTransactionId which we later assert cannot happen.
+ */
+ (void) GetTopTransactionId();
+}