From: Fujii Masao Date: Mon, 17 Mar 2014 11:41:12 +0000 (+0900) Subject: Fix bug in clean shutdown of walsender that pg_receiving is connecting to. X-Git-Tag: REL9_3_4~3 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3857234053fccbea6344cc4a1b632750621d51d8;p=postgresql 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. --- diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index 54ed311473..4abb0007c7 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -1053,9 +1053,20 @@ WalSndLoop(void) */ if (walsender_ready_to_stop) { + XLogRecPtr replicatedPtr; + /* ... let's just be real sure we're caught up ... */ XLogSend(&caughtup); - if (caughtup && 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 && sentPtr == replicatedPtr && !pq_is_send_pending()) { /* Inform the standby that XLOG streaming is done */