Skip to content

Commit 8f779a1

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 3eff168 commit 8f779a1

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
@@ -3295,24 +3295,41 @@ ExpireTreeKnownAssignedTransactionIds(TransactionId xid, int nsubxids,
32953295

32963296
/*
32973297
* ExpireAllKnownAssignedTransactionIds
3298-
* Remove all entries in KnownAssignedXids
3298+
* Remove all entries in KnownAssignedXids and reset lastOverflowedXid.
32993299
*/
33003300
void
33013301
ExpireAllKnownAssignedTransactionIds(void)
33023302
{
33033303
LWLockAcquire(ProcArrayLock, LW_EXCLUSIVE);
33043304
KnownAssignedXidsRemovePreceding(InvalidTransactionId);
3305+
3306+
/*
3307+
* Reset lastOverflowedXid. Currently, lastOverflowedXid has no use after
3308+
* the call of this function. But do this for unification with what
3309+
* ExpireOldKnownAssignedTransactionIds() do.
3310+
*/
3311+
procArray->lastOverflowedXid = InvalidTransactionId;
33053312
LWLockRelease(ProcArrayLock);
33063313
}
33073314

33083315
/*
33093316
* ExpireOldKnownAssignedTransactionIds
3310-
* Remove KnownAssignedXids entries preceding the given XID
3317+
* Remove KnownAssignedXids entries preceding the given XID and
3318+
* potentially reset lastOverflowedXid.
33113319
*/
33123320
void
33133321
ExpireOldKnownAssignedTransactionIds(TransactionId xid)
33143322
{
33153323
LWLockAcquire(ProcArrayLock, LW_EXCLUSIVE);
3324+
3325+
/*
3326+
* Reset lastOverflowedXid if we know all transactions that have been
3327+
* possibly running are being gone. Not doing so could cause an incorrect
3328+
* lastOverflowedXid value, which makes extra snapshots be marked as
3329+
* suboverflowed.
3330+
*/
3331+
if (TransactionIdPrecedes(procArray->lastOverflowedXid, xid))
3332+
procArray->lastOverflowedXid = InvalidTransactionId;
33163333
KnownAssignedXidsRemovePreceding(xid);
33173334
LWLockRelease(ProcArrayLock);
33183335
}

0 commit comments

Comments
 (0)