aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFujii Masao <fujii@postgresql.org>2019-10-18 22:32:18 +0900
committerFujii Masao <fujii@postgresql.org>2019-10-18 22:35:41 +0900
commit1b2ba8874ad39491c7b66ef65087c3c532864842 (patch)
tree8bfb0a0b54e1dd43c569838a1fa0c98a36cdbf36
parentb2ab06e0251a6733ea07d3a010e4a868b0595fce (diff)
downloadpostgresql-1b2ba8874ad39491c7b66ef65087c3c532864842.tar.gz
postgresql-1b2ba8874ad39491c7b66ef65087c3c532864842.zip
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
-rw-r--r--src/backend/access/transam/xlog.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 8448b2078fa..97944d7c90f 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -6097,7 +6097,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 */
@@ -7060,7 +7060,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);
/*
@@ -11487,6 +11487,12 @@ WaitForWALToBecomeAvailable(XLogRecPtr RecPtr, bool randAccess,
*/
/*
+ * 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
* WAL that we restore from archive.
@@ -11598,6 +11604,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.
*/
if (!WalRcvStreaming())