diff options
Diffstat (limited to 'src/backend/storage/ipc/standby.c')
-rw-r--r-- | src/backend/storage/ipc/standby.c | 29 |
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(); +} |