Skip to content

Commit 6943fb9

Browse files
committed
Ignore nextOid when replaying an ONLINE checkpoint.
The nextOid value is from the start of the checkpoint and may well be stale compared to values from more recent XLOG_NEXTOID records. Previously, we adopted it anyway, allowing the OID counter to go backwards during a crash. While this should be harmless, it contributed to the severity of the bug fixed in commit 0408e1e, by allowing duplicate TOAST OIDs to be assigned immediately following a crash. Without this error, that issue would only have arisen when TOAST objects just younger than a multiple of 2^32 OIDs were deleted and then not vacuumed in time to avoid a conflict. Pavan Deolasee Discussion: https://postgr.es/m/CABOikdOgWT2hHkYG3Wwo2cyZJq2zfs1FH0FgX-=h4OLosXHf9w@mail.gmail.com
1 parent 5b3ed6b commit 6943fb9

File tree

1 file changed

+14
-5
lines changed
  • src/backend/access/transam

1 file changed

+14
-5
lines changed

src/backend/access/transam/xlog.c

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9473,11 +9473,20 @@ xlog_redo(XLogRecPtr lsn, XLogRecord *record)
94739473
checkPoint.nextXid))
94749474
ShmemVariableCache->nextXid = checkPoint.nextXid;
94759475
LWLockRelease(XidGenLock);
9476-
/* ... but still treat OID counter as exact */
9477-
LWLockAcquire(OidGenLock, LW_EXCLUSIVE);
9478-
ShmemVariableCache->nextOid = checkPoint.nextOid;
9479-
ShmemVariableCache->oidCount = 0;
9480-
LWLockRelease(OidGenLock);
9476+
9477+
/*
9478+
* We ignore the nextOid counter in an ONLINE checkpoint, preferring
9479+
* to track OID assignment through XLOG_NEXTOID records. The nextOid
9480+
* counter is from the start of the checkpoint and might well be stale
9481+
* compared to later XLOG_NEXTOID records. We could try to take the
9482+
* maximum of the nextOid counter and our latest value, but since
9483+
* there's no particular guarantee about the speed with which the OID
9484+
* counter wraps around, that's a risky thing to do. In any case,
9485+
* users of the nextOid counter are required to avoid assignment of
9486+
* duplicates, so that a somewhat out-of-date value should be safe.
9487+
*/
9488+
9489+
/* Handle multixact */
94819490
MultiXactAdvanceNextMXact(checkPoint.nextMulti,
94829491
checkPoint.nextMultiOffset);
94839492
if (TransactionIdPrecedes(ShmemVariableCache->oldestXid,

0 commit comments

Comments
 (0)