Skip to content

Commit 05e0aff

Browse files
committed
Fix nextXid tracking bug on standbys (9.5-11 only).
RecordKnownAssignedTransactionIds() should never move nextXid backwards. Before this commit, that could happen if some other code path had advanced it without advancing latestObservedXid. One consequence is that a well timed XLOG_CHECKPOINT_ONLINE could cause hot standby feedback messages to get confused and report an xmin from a future epoch, potentially allowing vacuum to run too soon on the primary. Repair, by making sure RecordKnownAssignedTransactionIds() can only move nextXid forwards. In release 12 and master, this was already done by commit 2fc7af5, which consolidated similar code and straightened out this bug. Back-patch to supported releases before that. Author: Eka Palamadai <ekanatha@amazon.com> Discussion: https://postgr.es/m/98BB4805-D0A2-48E1-96F4-15014313EADC@amazon.com
1 parent 064e029 commit 05e0aff

File tree

1 file changed

+2
-1
lines changed

1 file changed

+2
-1
lines changed

src/backend/storage/ipc/procarray.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3248,7 +3248,8 @@ RecordKnownAssignedTransactionIds(TransactionId xid)
32483248
next_expected_xid = latestObservedXid;
32493249
TransactionIdAdvance(next_expected_xid);
32503250
LWLockAcquire(XidGenLock, LW_EXCLUSIVE);
3251-
ShmemVariableCache->nextXid = next_expected_xid;
3251+
if (TransactionIdFollows(next_expected_xid, ShmemVariableCache->nextXid))
3252+
ShmemVariableCache->nextXid = next_expected_xid;
32523253
LWLockRelease(XidGenLock);
32533254
}
32543255
}

0 commit comments

Comments
 (0)