From: Kyotaro Horiguchi Date: Thu, 5 Mar 2020 11:54:07 +0900 Subject: [PATCH v4 3/3] Fix a crash bug of targetted promotion. After recovery target is reached, StartupXLOG turns off standby mode then refetches the last record. If the last record starts from the previous segment at the time, WaitForWALToBecomeAvailable crashes with assertion failure. WaitForWALToBecomeAvailable should move back to XLOG_FROM_ARCHIVE if standby mode is turned off while XLOG_FROM_STREAM. --- src/backend/access/transam/xlog.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index db054c8d32..88abd53cfb 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -11844,7 +11844,8 @@ WaitForWALToBecomeAvailable(XLogRecPtr RecPtr, bool randAccess, * 1. Read from either archive or pg_wal (XLOG_FROM_ARCHIVE), or just * pg_wal (XLOG_FROM_PG_WAL) * 2. Check trigger file - * 3. Read from primary server via walreceiver (XLOG_FROM_STREAM) + * 3. Read from primary server via walreceiver (XLOG_FROM_STREAM). + * If StandbyMode is turned off, the state machine goes back to 1. * 4. Rescan timelines * 5. Sleep wal_retrieve_retry_interval milliseconds, and loop back to 1. * @@ -11859,8 +11860,12 @@ WaitForWALToBecomeAvailable(XLogRecPtr RecPtr, bool randAccess, */ if (!InArchiveRecovery) currentSource = XLOG_FROM_PG_WAL; - else if (currentSource == 0) + else if (currentSource == 0 || + (!StandbyMode && currentSource == XLOG_FROM_STREAM)) + { + lastSourceFailed = false; /* We haven't failed on the new source */ currentSource = XLOG_FROM_ARCHIVE; + } for (;;) { @@ -12054,6 +12059,9 @@ WaitForWALToBecomeAvailable(XLogRecPtr RecPtr, bool randAccess, { case XLOG_FROM_ARCHIVE: case XLOG_FROM_PG_WAL: + /* Wal receiver shouln't be active here */ + Assert(!WalRcvStreaming()); + /* Close any old file we might have open. */ if (readFile >= 0) { -- 2.18.2 ----Next_Part(Fri_Mar__6_10_29_46_2020_013)----