postgres.git / summary / log / commit / refs

commit    7899aa356a06181dfa4f958ea2f7276ec7253da1
Author:   Fujii Masao <fujii@postgresql.org>
Date:     Mon Mar 17 11:41:52 2014 +0000

    Fix bug in clean shutdown of walsender that pg_receiving is connecting to.
    
    On clean shutdown, walsender waits for all WAL to be replicated to a standby,
    and exits. It determined whether that replication had been completed by
    checking whether its sent location had been equal to a standby's flush
    location. Unfortunately this condition never becomes true when the standby
    such as pg_receivexlog which always returns an invalid flush location is
    connecting to walsender, and then walsender waits forever.
    
    This commit changes walsender so that it just checks a standby's write
    location if a flush location is invalid.
    
    Back-patch to 9.1 where enough infrastructure for this exists.


src/backend/replication/walsender.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index fdf44a46e5f..691db704670 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -808,9 +808,20 @@ WalSndLoop(void) */ if (walsender_ready_to_stop) { + XLogRecPtr replicatedPtr; + /* ... let's just be real sure we're caught up ... */ XLogSend(output_message, &caughtup); - if (caughtup && XLByteEQ(sentPtr, MyWalSnd->flush) && + + /* + * Check a write location to see whether all the WAL have + * successfully been replicated if this walsender is connecting + * to a standby such as pg_receivexlog which always returns + * an invalid flush location. Otherwise, check a flush location. + */ + replicatedPtr = XLogRecPtrIsInvalid(MyWalSnd->flush) ? + MyWalSnd->write : MyWalSnd->flush; + if (caughtup && XLByteEQ(sentPtr, replicatedPtr) && !pq_is_send_pending()) { walsender_shutdown_requested = true; [parent: ba5946e8696e]