Skip to content

Commit 774d005

Browse files
committed
Reset lastOverflowedXid on standby when needed
Currently, lastOverflowedXid is never reset. It's just adjusted on new transactions known to be overflowed. But if there are no overflowed transactions for a long time, snapshots could be mistakenly marked as suboverflowed due to wraparound. This commit fixes this issue by resetting lastOverflowedXid when needed altogether with KnownAssignedXids. Backpatch to all supported versions. Reported-by: Stan Hu Discussion: https://postgr.es/m/CAMBWrQ%3DFp5UAsU_nATY7EMY7NHczG4-DTDU%3DmCvBQZAQ6wa2xQ%40mail.gmail.com Author: Kyotaro Horiguchi, Alexander Korotkov Reviewed-by: Stan Hu, Simon Riggs, Nikolay Samokhvalov, Andrey Borodin, Dmitry Dolgov
1 parent 58b600f commit 774d005

File tree

1 file changed

+19
-2
lines changed

1 file changed

+19
-2
lines changed

src/backend/storage/ipc/procarray.c

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3290,24 +3290,41 @@ ExpireTreeKnownAssignedTransactionIds(TransactionId xid, int nsubxids,
32903290

32913291
/*
32923292
* ExpireAllKnownAssignedTransactionIds
3293-
* Remove all entries in KnownAssignedXids
3293+
* Remove all entries in KnownAssignedXids and reset lastOverflowedXid.
32943294
*/
32953295
void
32963296
ExpireAllKnownAssignedTransactionIds(void)
32973297
{
32983298
LWLockAcquire(ProcArrayLock, LW_EXCLUSIVE);
32993299
KnownAssignedXidsRemovePreceding(InvalidTransactionId);
3300+
3301+
/*
3302+
* Reset lastOverflowedXid. Currently, lastOverflowedXid has no use after
3303+
* the call of this function. But do this for unification with what
3304+
* ExpireOldKnownAssignedTransactionIds() do.
3305+
*/
3306+
procArray->lastOverflowedXid = InvalidTransactionId;
33003307
LWLockRelease(ProcArrayLock);
33013308
}
33023309

33033310
/*
33043311
* ExpireOldKnownAssignedTransactionIds
3305-
* Remove KnownAssignedXids entries preceding the given XID
3312+
* Remove KnownAssignedXids entries preceding the given XID and
3313+
* potentially reset lastOverflowedXid.
33063314
*/
33073315
void
33083316
ExpireOldKnownAssignedTransactionIds(TransactionId xid)
33093317
{
33103318
LWLockAcquire(ProcArrayLock, LW_EXCLUSIVE);
3319+
3320+
/*
3321+
* Reset lastOverflowedXid if we know all transactions that have been
3322+
* possibly running are being gone. Not doing so could cause an incorrect
3323+
* lastOverflowedXid value, which makes extra snapshots be marked as
3324+
* suboverflowed.
3325+
*/
3326+
if (TransactionIdPrecedes(procArray->lastOverflowedXid, xid))
3327+
procArray->lastOverflowedXid = InvalidTransactionId;
33113328
KnownAssignedXidsRemovePreceding(xid);
33123329
LWLockRelease(ProcArrayLock);
33133330
}

0 commit comments

Comments
 (0)