aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/storage/ipc/procarray.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/src/backend/storage/ipc/procarray.c b/src/backend/storage/ipc/procarray.c
index e2f71da4a01..93cdc97166c 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;
@@ -1067,6 +1068,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.
*/
StandbyReleaseOldLocks(running->oldestRunningXid);
@@ -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");