diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index 717cbfd61c6c58b38c44bf3f653e22e2e190fbc8..4006c10ca43c8a9bb35c908c8cb8882feefaae87 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -27,7 +27,8 @@ * If the server is shut down, postmaster sends us SIGUSR2 after all * regular backends have exited and the shutdown checkpoint has been written. * This instruct walsender to send any outstanding WAL, including the - * shutdown checkpoint record, and then exit. + * shutdown checkpoint record, wait for it to be replicated to the standby, + * and then exit. * * * Portions Copyright (c) 2010-2013, PostgreSQL Global Development Group @@ -1045,7 +1046,8 @@ WalSndLoop(void) /* * When SIGUSR2 arrives, we send any outstanding logs up to the - * shutdown checkpoint record (i.e., the latest record) and exit. + * shutdown checkpoint record (i.e., the latest record), wait + * for them to be replicated to the standby, and exit. * This may be a normal termination at shutdown, or a promotion, * the walsender is not sure which. */ @@ -1053,7 +1055,8 @@ WalSndLoop(void) { /* ... let's just be real sure we're caught up ... */ XLogSend(&caughtup); - if (caughtup && !pq_is_send_pending()) + if (caughtup && sentPtr == MyWalSnd->flush && + !pq_is_send_pending()) { /* Inform the standby that XLOG streaming is done */ EndCommand("COPY 0", DestRemote); @@ -1728,7 +1731,8 @@ WalSndLastCycleHandler(SIGNAL_ARGS) /* * If replication has not yet started, die like with SIGTERM. If * replication is active, only set a flag and wake up the main loop. It - * will send any outstanding WAL, and then exit gracefully. + * will send any outstanding WAL, wait for it to be replicated to + * the standby, and then exit gracefully. */ if (!replication_active) kill(MyProcPid, SIGTERM);