Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 05e6e78

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 d8bf0a1 commit 05e6e78

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

44454445
/*
44464446
* ExpireAllKnownAssignedTransactionIds
4447-
* Remove all entries in KnownAssignedXids
4447+
* Remove all entries in KnownAssignedXids and reset lastOverflowedXid.
44484448
*/
44494449
void
44504450
ExpireAllKnownAssignedTransactionIds(void)
44514451
{
44524452
LWLockAcquire(ProcArrayLock, LW_EXCLUSIVE);
44534453
KnownAssignedXidsRemovePreceding(InvalidTransactionId);
4454+
4455+
/*
4456+
* Reset lastOverflowedXid. Currently, lastOverflowedXid has no use after
4457+
* the call of this function. But do this for unification with what
4458+
* ExpireOldKnownAssignedTransactionIds() do.
4459+
*/
4460+
procArray->lastOverflowedXid = InvalidTransactionId;
44544461
LWLockRelease(ProcArrayLock);
44554462
}
44564463

44574464
/*
44584465
* ExpireOldKnownAssignedTransactionIds
4459-
* Remove KnownAssignedXids entries preceding the given XID
4466+
* Remove KnownAssignedXids entries preceding the given XID and
4467+
* potentially reset lastOverflowedXid.
44604468
*/
44614469
void
44624470
ExpireOldKnownAssignedTransactionIds(TransactionId xid)
44634471
{
44644472
LWLockAcquire(ProcArrayLock, LW_EXCLUSIVE);
4473+
4474+
/*
4475+
* Reset lastOverflowedXid if we know all transactions that have been
4476+
* possibly running are being gone. Not doing so could cause an incorrect
4477+
* lastOverflowedXid value, which makes extra snapshots be marked as
4478+
* suboverflowed.
4479+
*/
4480+
if (TransactionIdPrecedes(procArray->lastOverflowedXid, xid))
4481+
procArray->lastOverflowedXid = InvalidTransactionId;
44654482
KnownAssignedXidsRemovePreceding(xid);
44664483
LWLockRelease(ProcArrayLock);
44674484
}

0 commit comments

Comments
 (0)