aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/replication/walsender.c17
1 files changed, 9 insertions, 8 deletions
diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c
index 754f505c139..2d1a9ec900f 100644
--- a/src/backend/replication/walsender.c
+++ b/src/backend/replication/walsender.c
@@ -1057,16 +1057,21 @@ logical_read_xlog_page(XLogReaderState *state, XLogRecPtr targetPagePtr, int req
/*
* Make sure we have enough WAL available before retrieving the current
- * timeline. This is needed to determine am_cascading_walsender accurately
- * which is needed to determine the current timeline.
+ * timeline.
*/
flushptr = WalSndWaitForWal(targetPagePtr + reqLen);
+ /* Fail if not enough (implies we are going to shut down) */
+ if (flushptr < targetPagePtr + reqLen)
+ return -1;
+
/*
* Since logical decoding is also permitted on a standby server, we need
* to check if the server is in recovery to decide how to get the current
- * timeline ID (so that it also cover the promotion or timeline change
- * cases).
+ * timeline ID (so that it also covers the promotion or timeline change
+ * cases). We must determine am_cascading_walsender after waiting for the
+ * required WAL so that it is correct when the walsender wakes up after a
+ * promotion.
*/
am_cascading_walsender = RecoveryInProgress();
@@ -1081,10 +1086,6 @@ logical_read_xlog_page(XLogReaderState *state, XLogRecPtr targetPagePtr, int req
sendTimeLineValidUpto = state->currTLIValidUntil;
sendTimeLineNextTLI = state->nextTLI;
- /* fail if not (implies we are going to shut down) */
- if (flushptr < targetPagePtr + reqLen)
- return -1;
-
if (targetPagePtr + XLOG_BLCKSZ <= flushptr)
count = XLOG_BLCKSZ; /* more than one block available */
else