diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 096c5c532b..f7746080a6 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -6684,21 +6684,13 @@ StartupXLOG(void) } /* - * Initialize shared replayEndRecPtr, lastReplayedEndRecPtr, and - * recoveryLastXTime. - * - * This is slightly confusing if we're starting from an online - * checkpoint; we've just read and replayed the checkpoint record, but - * we're going to start replay from its redo pointer, which precedes - * the location of the checkpoint record itself. So even though the - * last record we've replayed is indeed ReadRecPtr, we haven't - * replayed all the preceding records yet. That's OK for the current - * use of these variables. + * Initialize shared variables for tracking progress of WAL replay, + * as if we had just replayed the record before the REDO location. */ SpinLockAcquire(&xlogctl->info_lck); - xlogctl->replayEndRecPtr = ReadRecPtr; + xlogctl->replayEndRecPtr = checkPoint.redo; xlogctl->replayEndTLI = ThisTimeLineID; - xlogctl->lastReplayedEndRecPtr = EndRecPtr; + xlogctl->lastReplayedEndRecPtr = checkPoint.redo; xlogctl->lastReplayedTLI = ThisTimeLineID; xlogctl->recoveryLastXTime = 0; xlogctl->currentChunkStartTime = 0; @@ -7388,6 +7380,8 @@ StartupXLOG(void) static void CheckRecoveryConsistency(void) { + XLogRecPtr lastReplayedEndRecPtr; + /* * During crash recovery, we don't reach a consistent state until we've * replayed all the WAL. @@ -7395,11 +7389,17 @@ CheckRecoveryConsistency(void) if (XLogRecPtrIsInvalid(minRecoveryPoint)) return; + /* + * assume that we are called in the startup process, and hence don't need + * a lock to read lastReplayedEndRecPtr + */ + lastReplayedEndRecPtr = XLogCtl->lastReplayedEndRecPtr; + /* * Have we reached the point where our base backup was completed? */ if (!XLogRecPtrIsInvalid(ControlFile->backupEndPoint) && - ControlFile->backupEndPoint <= EndRecPtr) + ControlFile->backupEndPoint <= lastReplayedEndRecPtr) { /* * We have reached the end of base backup, as indicated by pg_control. @@ -7412,8 +7412,8 @@ CheckRecoveryConsistency(void) LWLockAcquire(ControlFileLock, LW_EXCLUSIVE); - if (ControlFile->minRecoveryPoint < EndRecPtr) - ControlFile->minRecoveryPoint = EndRecPtr; + if (ControlFile->minRecoveryPoint < lastReplayedEndRecPtr) + ControlFile->minRecoveryPoint = lastReplayedEndRecPtr; ControlFile->backupStartPoint = InvalidXLogRecPtr; ControlFile->backupEndPoint = InvalidXLogRecPtr; @@ -7431,7 +7431,7 @@ CheckRecoveryConsistency(void) * consistent yet. */ if (!reachedConsistency && !ControlFile->backupEndRequired && - minRecoveryPoint <= XLogCtl->lastReplayedEndRecPtr && + minRecoveryPoint <= lastReplayedEndRecPtr && XLogRecPtrIsInvalid(ControlFile->backupStartPoint)) { /* @@ -7443,8 +7443,8 @@ CheckRecoveryConsistency(void) reachedConsistency = true; ereport(LOG, (errmsg("consistent recovery state reached at %X/%X", - (uint32) (XLogCtl->lastReplayedEndRecPtr >> 32), - (uint32) XLogCtl->lastReplayedEndRecPtr))); + (uint32) (lastReplayedEndRecPtr >> 32), + (uint32) lastReplayedEndRecPtr))); } /*