Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
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:22:14 +0000 (12:22 +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/xlog.c

index 0666a883eafc53c4a00c4d4778d68ee9d44730d0..a4bc8c88eb69da0824461a9a22f4558a6f9780bf 100644 (file)
@@ -4464,7 +4464,7 @@ readTimeLineHistory(TimeLineID targetTLI)
    if (targetTLI == 1)
        return list_make1_int((int) targetTLI);
 
-   if (InArchiveRecovery)
+   if (ArchiveRecoveryRequested)
    {
        TLHistoryFileName(histfname, targetTLI);
        fromArchive =
@@ -4561,7 +4561,7 @@ existsTimeLineHistory(TimeLineID probeTLI)
    if (probeTLI == 1)
        return false;
 
-   if (InArchiveRecovery)
+   if (ArchiveRecoveryRequested)
    {
        TLHistoryFileName(histfname, probeTLI);
        RestoreArchivedFile(path, histfname, "RECOVERYHISTORY", 0);
@@ -5758,11 +5758,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 */
@@ -5779,7 +5774,6 @@ readRecoveryCommandFile(void)
            recoveryTargetTLI = findNewestTimeLine(recoveryTargetTLI);
            recoveryTargetIsLatest = true;
        }
-       InArchiveRecovery = false;
    }
 
    FreeConfigVariables(head);