diff --git a/src/backend/storage/ipc/procarray.c b/src/backend/storage/ipc/procarray.c index e2f71da4a0..93cdc97166 100644 --- a/src/backend/storage/ipc/procarray.c +++ b/src/backend/storage/ipc/procarray.c @@ -1053,6 +1053,7 @@ void ProcArrayApplyRecoveryInfo(RunningTransactions running) { TransactionId *xids; + TransactionId xid; int nxids; int i; @@ -1066,6 +1067,16 @@ ProcArrayApplyRecoveryInfo(RunningTransactions running) */ ExpireOldKnownAssignedTransactionIds(running->oldestRunningXid); + /* + * Adjust TransamVariables->nextXid before StandbyReleaseOldLocks(), + * because we will need it up to date for accessing two-phase transactions + * in StandbyReleaseOldLocks(). + */ + xid = running->nextXid; + TransactionIdRetreat(xid); + AdvanceNextFullTransactionIdPastXid(xid); + Assert(FullTransactionIdIsValid(TransamVariables->nextXid)); + /* * Remove stale locks, if any. */ @@ -1275,11 +1286,6 @@ ProcArrayApplyRecoveryInfo(RunningTransactions running) LWLockRelease(ProcArrayLock); - /* TransamVariables->nextXid must be beyond any observed xid. */ - AdvanceNextFullTransactionIdPastXid(latestObservedXid); - - Assert(FullTransactionIdIsValid(TransamVariables->nextXid)); - KnownAssignedXidsDisplay(DEBUG3); if (standbyState == STANDBY_SNAPSHOT_READY) elog(DEBUG1, "recovery snapshots are now enabled");