From d009f9036d62762b6a261055e7417ae911233853 Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas Date: Thu, 7 Mar 2013 12:12:33 +0200 Subject: [PATCH] Further fix to the mode where we enter archive recovery after crash recovery. 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 | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 92adc4e9fe..0666a883ea 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -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, -- 2.40.0