diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 9bec660992..9d96044cbd 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -562,7 +562,13 @@ static TimeLineID lastPageTLI = 0; static XLogRecPtr minRecoveryPoint; /* local copy of * ControlFile->minRecoveryPoint */ static bool updateMinRecoveryPoint = true; -bool reachedMinRecoveryPoint = false; + +/* + * Have we reached a consistent database state? In crash recovery, we have + * to replay all the WAL, so reachedConsistency is never set. During archive + * recovery, the database is consistent once minRecoveryPoint is reached. + */ +bool reachedConsistency = false; static bool InRedo = false; @@ -6893,10 +6899,17 @@ StartupXLOG(void) static void CheckRecoveryConsistency(void) { + /* + * During crash recovery, we don't reach a consistent state until we've + * replayed all the WAL. + */ + if (XLogRecPtrIsInvalid(minRecoveryPoint)) + return; + /* * Have we passed our safe starting point? */ - if (!reachedMinRecoveryPoint && + if (!reachedConsistency && XLByteLE(minRecoveryPoint, EndRecPtr) && XLogRecPtrIsInvalid(ControlFile->backupStartPoint)) { @@ -6906,7 +6919,7 @@ CheckRecoveryConsistency(void) */ XLogCheckInvalidPages(); - reachedMinRecoveryPoint = true; + reachedConsistency = true; ereport(LOG, (errmsg("consistent recovery state reached at %X/%X", EndRecPtr.xlogid, EndRecPtr.xrecoff))); @@ -6919,7 +6932,7 @@ CheckRecoveryConsistency(void) */ if (standbyState == STANDBY_SNAPSHOT_READY && !LocalHotStandbyActive && - reachedMinRecoveryPoint && + reachedConsistency && IsUnderPostmaster) { /* use volatile pointer to prevent code rearrangement */ diff --git a/src/backend/access/transam/xlogutils.c b/src/backend/access/transam/xlogutils.c index 350d434562..b280434a82 100644 --- a/src/backend/access/transam/xlogutils.c +++ b/src/backend/access/transam/xlogutils.c @@ -85,7 +85,7 @@ log_invalid_page(RelFileNode node, ForkNumber forkno, BlockNumber blkno, * linger in the hash table until the end of recovery and PANIC there, * which might come only much later if this is a standby server. */ - if (reachedMinRecoveryPoint) + if (reachedConsistency) { report_invalid_page(WARNING, node, forkno, blkno, present); elog(PANIC, "WAL contains references to invalid pages"); diff --git a/src/include/access/xlog.h b/src/include/access/xlog.h index 1fb56cdfd5..1b31414060 100644 --- a/src/include/access/xlog.h +++ b/src/include/access/xlog.h @@ -190,7 +190,7 @@ typedef enum extern XLogRecPtr XactLastRecEnd; -extern bool reachedMinRecoveryPoint; +extern bool reachedConsistency; /* these variables are GUC parameters related to XLOG */ extern int CheckPointSegments;