Fix bug in clean shutdown of walsender that pg_receiving is connecting to.
authorFujii Masao
Mon, 17 Mar 2014 11:37:50 +0000 (20:37 +0900)
committerFujii Masao
Mon, 17 Mar 2014 11:37:50 +0000 (20:37 +0900)
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

index 09854112062de7e286461ff71590ce2e3dc26e91..6e22c03bcfaf433c4c7cf89fd76fdb4fc19fb0e3 100644 (file)
@@ -2446,10 +2446,20 @@ XLogSendLogical(void)
 static void
 WalSndDone(WalSndSendDataCallback send_data)
 {
+   XLogRecPtr  replicatedPtr;
+
    /* ... let's just be real sure we're caught up ... */
    send_data();
 
-   if (WalSndCaughtUp && 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 (WalSndCaughtUp && sentPtr == replicatedPtr &&
        !pq_is_send_pending())
    {
        /* Inform the standby that XLOG streaming is done */