diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 9bec6609921842c3edfe21dc7e25bf866e35e669..9d96044cbdc48828e3f1d057582174f8576ce05d 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 350d434562a1d91ea0da96a8973678a918bc9b4a..b280434a82969dfc4f2a3b00b22f7e4cec5304e0 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 1fb56cdfd543c33b15ea155dc32329e948ef96ad..1b31414060de8c0217cc7671c30f0209e4ea12d3 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;