]> granicus.if.org Git - postgresql/commitdiff
Further fix to the mode where we enter archive recovery after crash recovery.
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Thu, 7 Mar 2013 10:12:33 +0000 (12:12 +0200)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Thu, 7 Mar 2013 10:12:33 +0000 (12:12 +0200)
I missed to returns in the middle of ReadRecord function in my previous fix.
If a WAL file was not found at all during crash recovery, XLogPageRead would
return 'false', and ReadRecord would return without entering archive recovery.

9.2 only. In master, the code is structured differently and does not have this
problem.

Kyotaro HORIGUCHI, Mitsumasa KONDO and me.

src/backend/access/transam/xlog.c

index 92adc4e9fed9773ca8dd2356770a2d8ef10aa23f..0666a883eafc53c4a00c4d4778d68ee9d44730d0 100644 (file)
@@ -4010,7 +4010,16 @@ ReadRecord(XLogRecPtr *RecPtr, int emode, bool fetching_ckpt)
 retry:
        /* Read the page containing the record */
        if (!XLogPageRead(RecPtr, emode, fetching_ckpt, randAccess))
-               return NULL;
+       {
+               /*
+                * In standby-mode, XLogPageRead returning false means that promotion
+                * has been triggered.
+                */
+               if (StandbyMode)
+                       return NULL;
+               else
+                       goto next_record_is_invalid;
+       }
 
        pageHeaderSize = XLogPageHeaderSize((XLogPageHeader) readBuf);
        targetRecOff = RecPtr->xrecoff % XLOG_BLCKSZ;
@@ -4168,7 +4177,16 @@ retry:
                        }
                        /* Wait for the next page to become available */
                        if (!XLogPageRead(&pagelsn, emode, false, false))
-                               return NULL;
+                       {
+                               /*
+                                * In standby-mode, XLogPageRead returning false means that
+                                * promotion has been triggered.
+                                */
+                               if (StandbyMode)
+                                       return NULL;
+                               else
+                                       goto next_record_is_invalid;
+                       }
 
                        /* Check that the continuation record looks valid */
                        if (!(((XLogPageHeader) readBuf)->xlp_info & XLP_FIRST_IS_CONTRECORD))
@@ -10326,6 +10344,9 @@ CancelBackup(void)
  * and call XLogPageRead() again with the same arguments. This lets
  * XLogPageRead() to try fetching the record from another source, or to
  * sleep and retry.
+ *
+ * In standby mode, this only returns false if promotion has been triggered.
+ * Otherwise it keeps sleeping and retrying indefinitely.
  */
 static bool
 XLogPageRead(XLogRecPtr *RecPtr, int emode, bool fetching_ckpt,