1
0
mirror of https://github.com/postgres/postgres.git synced 2025-06-30 21:42:05 +03:00

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.
This commit is contained in:
Fujii Masao
2014-03-17 20:42:35 +09:00
parent f84997c7e6
commit 65e8dbb186

View File

@ -775,9 +775,20 @@ WalSndLoop(void)
*/ */
if (walsender_ready_to_stop) if (walsender_ready_to_stop)
{ {
XLogRecPtr replicatedPtr;
/* ... let's just be real sure we're caught up ... */ /* ... let's just be real sure we're caught up ... */
XLogSend(output_message, &caughtup); 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()) !pq_is_send_pending())
{ {
walsender_shutdown_requested = true; walsender_shutdown_requested = true;