postgres.git / summary / log / commit / refs

commit    579996bc2fc72b5496ccabe573bce8f2355c92df
Author:   Fujii Masao <fujii@postgresql.org>
Date:     Fri Oct 18 13:32:18 2019 +0000
First released in: 13.0, 9.4.25, 9.5.20, 9.6.16, 10.11, 11.6, 12.1

    Fix failure of archive recovery with recovery_min_apply_delay enabled.
    
    recovery_min_apply_delay parameter is intended for use with streaming
    replication deployments. However, the document clearly explains that
    the parameter will be honored in all cases if it's specified. So it should
    take effect even if in archive recovery. But, previously, archive recovery
    with recovery_min_apply_delay enabled always failed, and caused assertion
    failure if --enable-caasert is enabled.
    
    The cause of this problem is that; the ownership of recoveryWakeupLatch
    that recovery_min_apply_delay uses was taken only when standby mode
    is requested. So unowned latch could be used in archive recovery, and
    which caused the failure.
    
    This commit changes recovery code so that the ownership of
    recoveryWakeupLatch is taken even in archive recovery. Which prevents
    archive recovery with recovery_min_apply_delay from failing.
    
    Back-patch to v9.4 where recovery_min_apply_delay was added.
    
    Author: Fujii Masao
    Reviewed-by: Michael Paquier
    Discussion: https://postgr.es/m/CAHGQGwEyD6HdZLfdWc+95g=VQFPR4zQL4n+yHxQgGEGjaSVheQ@mail.gmail.com


src/backend/access/transam/xlog.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 4bd0907ca9a..f58dcdf0a15 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -6145,7 +6145,7 @@ StartupXLOG(void) * Take ownership of the wakeup latch if we're going to sleep during * recovery. */ - if (StandbyModeRequested) + if (ArchiveRecoveryRequested) OwnLatch(&XLogCtl->recoveryWakeupLatch); /* Set up XLOG reader facility */ @@ -7119,7 +7119,7 @@ StartupXLOG(void) * We don't need the latch anymore. It's not strictly necessary to disown * it, but let's do it for the sake of tidiness. */ - if (StandbyModeRequested) + if (ArchiveRecoveryRequested) DisownLatch(&XLogCtl->recoveryWakeupLatch); /* @@ -11582,6 +11582,12 @@ WaitForWALToBecomeAvailable(XLogRecPtr RecPtr, bool randAccess, * hope... */ + /* + * We should be able to move to XLOG_FROM_STREAM + * only in standby mode. + */ + Assert(StandbyMode); + /* * Before we leave XLOG_FROM_STREAM state, make sure that * walreceiver is not active, so that it won't overwrite @@ -11693,6 +11699,12 @@ WaitForWALToBecomeAvailable(XLogRecPtr RecPtr, bool randAccess, { bool havedata; + /* + * We should be able to move to XLOG_FROM_STREAM + * only in standby mode. + */ + Assert(StandbyMode); + /* * Check if WAL receiver is still active. */ [parent: 5f038991ecf9]