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]