Fix tli history file fetching, broken by the archive after crash recevery patch.
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Thu, 7 Mar 2013 10:18:41 +0000 (12:18 +0200)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Thu, 7 Mar 2013 10:33:24 +0000 (12:33 +0200)
If we were about to enter archive recovery after crash recovery, we scanned
the archive for the latest tli history file, and set the recovery target
timeline to that. However, when we actually tried to read the history file,
we would not fetch the file from the archive, because we were not in archive
recovery yet.

To fix, make readTimeLineHistory and existsTimeLineHistory to always fetch
the file from archive if archive recovery is requested, even if we're not in
archive recovery yet.

Backpatch to 9.2. Mitsumasa KONDO

src/backend/access/transam/timeline.c
src/backend/access/transam/xlog.c
src/include/access/xlog_internal.h

index 51b37ca8f8c2febf5ba4914a3d76c57e0d1ad4db..921da62c22adcc62cbe8c6d90426953271180c16 100644 (file)
@@ -92,7 +92,7 @@ readTimeLineHistory(TimeLineID targetTLI)
                return list_make1(entry);
        }
 
-       if (InArchiveRecovery)
+       if (ArchiveRecoveryRequested)
        {
                TLHistoryFileName(histfname, targetTLI);
                fromArchive =
@@ -213,7 +213,7 @@ existsTimeLineHistory(TimeLineID probeTLI)
        if (probeTLI == 1)
                return false;
 
-       if (InArchiveRecovery)
+       if (ArchiveRecoveryRequested)
        {
                TLHistoryFileName(histfname, probeTLI);
                RestoreArchivedFile(path, histfname, "RECOVERYHISTORY", 0, false);
@@ -316,7 +316,7 @@ writeTimeLineHistory(TimeLineID newTLI, TimeLineID parentTLI,
        /*
         * If a history file exists for the parent, copy it verbatim
         */
-       if (InArchiveRecovery)
+       if (ArchiveRecoveryRequested)
        {
                TLHistoryFileName(histfname, parentTLI);
                RestoreArchivedFile(path, histfname, "RECOVERYHISTORY", 0, false);
index d960bbcc208a607e7a359de155e2f281913f907d..a02eebcb27af04176f6984803b6ff2d263ecbd80 100644 (file)
@@ -200,7 +200,7 @@ static int  LocalXLogInsertAllowed = -1;
  * will switch to using offline XLOG archives as soon as we reach the end of
  * WAL in pg_xlog.
 */
-static bool ArchiveRecoveryRequested = false;
+bool ArchiveRecoveryRequested = false;
 bool InArchiveRecovery = false;
 
 /* Was the last xlog file restored from archive, or local? */
@@ -4339,11 +4339,6 @@ readRecoveryCommandFile(void)
         */
        if (rtliGiven)
        {
-               /*
-                * Temporarily set InArchiveRecovery, so that existsTimeLineHistory
-                * or findNewestTimeLine below will check the archive.
-                */
-               InArchiveRecovery = true;
                if (rtli)
                {
                        /* Timeline 1 does not have a history file, all else should */
@@ -4360,7 +4355,6 @@ readRecoveryCommandFile(void)
                        recoveryTargetTLI = findNewestTimeLine(recoveryTargetTLI);
                        recoveryTargetIsLatest = true;
                }
-               InArchiveRecovery = false;
        }
 
        FreeConfigVariables(head);
index c996c3c3ad867b8678a6971d4bfbc0d00231764f..351bb31d56c560f68256a6cfc0f284fec623f0fa 100644 (file)
@@ -263,6 +263,7 @@ extern void GetOldestRestartPoint(XLogRecPtr *oldrecptr, TimeLineID *oldtli);
  * Exported for the functions in timeline.c and xlogarchive.c.  Only valid
  * in the startup process.
  */
+extern bool ArchiveRecoveryRequested;
 extern bool InArchiveRecovery;
 extern bool StandbyMode;
 extern char *recoveryRestoreCommand;