diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/access/transam/xlog.c | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 49cccaed9c7..f0db58fb6e8 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -6331,6 +6331,10 @@ StartupXLOG(void) /* No need to hold ControlFileLock yet, we aren't up far enough */ UpdateControlFile(); + /* initialize shared-memory copy of latest checkpoint XID/epoch */ + XLogCtl->ckptXidEpoch = ControlFile->checkPointCopy.nextXidEpoch; + XLogCtl->ckptXid = ControlFile->checkPointCopy.nextXid; + /* initialize our local copy of minRecoveryPoint */ minRecoveryPoint = ControlFile->minRecoveryPoint; @@ -6875,10 +6879,6 @@ StartupXLOG(void) /* start the archive_timeout timer running */ XLogCtl->Write.lastSegSwitchTime = (pg_time_t) time(NULL); - /* initialize shared-memory copy of latest checkpoint XID/epoch */ - XLogCtl->ckptXidEpoch = ControlFile->checkPointCopy.nextXidEpoch; - XLogCtl->ckptXid = ControlFile->checkPointCopy.nextXid; - /* also initialize latestCompletedXid, to nextXid - 1 */ ShmemVariableCache->latestCompletedXid = ShmemVariableCache->nextXid; TransactionIdRetreat(ShmemVariableCache->latestCompletedXid); @@ -8461,6 +8461,17 @@ xlog_redo(XLogRecPtr lsn, XLogRecord *record) ControlFile->checkPointCopy.nextXidEpoch = checkPoint.nextXidEpoch; ControlFile->checkPointCopy.nextXid = checkPoint.nextXid; + /* Update shared-memory copy of checkpoint XID/epoch */ + { + /* use volatile pointer to prevent code rearrangement */ + volatile XLogCtlData *xlogctl = XLogCtl; + + SpinLockAcquire(&xlogctl->info_lck); + xlogctl->ckptXidEpoch = checkPoint.nextXidEpoch; + xlogctl->ckptXid = checkPoint.nextXid; + SpinLockRelease(&xlogctl->info_lck); + } + /* * TLI may change in a shutdown checkpoint, but it shouldn't decrease */ @@ -8501,6 +8512,17 @@ xlog_redo(XLogRecPtr lsn, XLogRecord *record) ControlFile->checkPointCopy.nextXidEpoch = checkPoint.nextXidEpoch; ControlFile->checkPointCopy.nextXid = checkPoint.nextXid; + /* Update shared-memory copy of checkpoint XID/epoch */ + { + /* use volatile pointer to prevent code rearrangement */ + volatile XLogCtlData *xlogctl = XLogCtl; + + SpinLockAcquire(&xlogctl->info_lck); + xlogctl->ckptXidEpoch = checkPoint.nextXidEpoch; + xlogctl->ckptXid = checkPoint.nextXid; + SpinLockRelease(&xlogctl->info_lck); + } + /* TLI should not change in an on-line checkpoint */ if (checkPoint.ThisTimeLineID != ThisTimeLineID) ereport(PANIC, |