Revert the patch to check if we've reached end-of-backup also when doing
authorHeikki Linnakangas
Wed, 13 Apr 2011 18:33:59 +0000 (21:33 +0300)
committerHeikki Linnakangas
Wed, 13 Apr 2011 19:00:43 +0000 (22:00 +0300)
crash recovery, and throw an error if not. hubert depesz lubaczewski pointed
out that that situation also happens in the crash recovery following a
system crash that happens during an online backup.

We might want to do something smarter in 9.1, like put the check back for
backups taken with pg_basebackup, but that's for another patch.

src/backend/access/transam/xlog.c

index eac61c5727c2373f05b8505ac8b39c1c6636407c..56f32f6ed8da73bf1f4302d916918595f753f450 100644 (file)
@@ -6322,12 +6322,28 @@ StartupXLOG(void)
        (XLByteLT(EndOfLog, minRecoveryPoint) ||
         !XLogRecPtrIsInvalid(ControlFile->backupStartPoint)))
    {
-       if (reachedStopPoint)   /* stopped because of stop request */
+       if (reachedStopPoint)
+       {
+           /* stopped because of stop request */
            ereport(FATAL,
                    (errmsg("requested recovery stop point is before consistent recovery point")));
-       else    /* ran off end of WAL */
-           ereport(FATAL,
-                   (errmsg("WAL ends before consistent recovery point")));
+       }
+       else
+       {
+           /*
+            * Ran off end of WAL before reaching end-of-backup WAL record,
+            * or minRecoveryPoint. That's usually a bad sign, indicating that
+            * you tried to recover from an online backup but never called
+            * pg_stop_backup(), or you didn't archive all the WAL up to that
+            * point. However, this also happens in crash recovery, if the
+            * system crashes while an online backup is in progress. We
+            * must not treat that as an error, or the database will refuse
+            * to start up.
+            */
+           if (InArchiveRecovery)
+               ereport(FATAL,
+                       (errmsg("WAL ends before consistent recovery point")));
+       }
    }
 
    /*
@@ -7910,7 +7926,8 @@ xlog_redo(XLogRecPtr lsn, XLogRecord *record)
         * record, the backup was cancelled and the end-of-backup record will
         * never arrive.
         */
-       if (!XLogRecPtrIsInvalid(ControlFile->backupStartPoint))
+       if (InArchiveRecovery &&
+           !XLogRecPtrIsInvalid(ControlFile->backupStartPoint))
            ereport(ERROR,
                    (errmsg("online backup was cancelled, recovery cannot continue")));