summaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend')
-rw-r--r--src/backend/access/transam/xlog.c14
-rw-r--r--src/backend/access/transam/xlogrecovery.c13
2 files changed, 22 insertions, 5 deletions
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index fd91bcd68ec..8c0d9dbfa8b 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -9519,10 +9519,7 @@ void
XLogShutdownWalRcv(void)
{
ShutdownWalRcv();
-
- LWLockAcquire(ControlFileLock, LW_EXCLUSIVE);
- XLogCtl->InstallXLogFileSegmentActive = false;
- LWLockRelease(ControlFileLock);
+ ResetInstallXLogFileSegmentActive();
}
/* Enable WAL file recycling and preallocation. */
@@ -9534,6 +9531,15 @@ SetInstallXLogFileSegmentActive(void)
LWLockRelease(ControlFileLock);
}
+/* Disable WAL file recycling and preallocation. */
+void
+ResetInstallXLogFileSegmentActive(void)
+{
+ LWLockAcquire(ControlFileLock, LW_EXCLUSIVE);
+ XLogCtl->InstallXLogFileSegmentActive = false;
+ LWLockRelease(ControlFileLock);
+}
+
bool
IsInstallXLogFileSegmentActive(void)
{
diff --git a/src/backend/access/transam/xlogrecovery.c b/src/backend/access/transam/xlogrecovery.c
index 3e3c4da01a2..cb62d43077d 100644
--- a/src/backend/access/transam/xlogrecovery.c
+++ b/src/backend/access/transam/xlogrecovery.c
@@ -3687,8 +3687,19 @@ WaitForWALToBecomeAvailable(XLogRecPtr RecPtr, bool randAccess,
* 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.
+ *
+ * If walreceiver is actively streaming (or attempting to
+ * connect), we must shut it down. However, if it's
+ * already in WAITING state (e.g., due to timeline
+ * divergence), we only need to reset the install flag to
+ * allow archive restoration.
*/
- XLogShutdownWalRcv();
+ if (WalRcvStreaming())
+ XLogShutdownWalRcv();
+ else
+ {
+ ResetInstallXLogFileSegmentActive();
+ }
/*
* Before we sleep, re-scan for possible new timelines if