diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/replication/walsender.c | 17 |
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 |