mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-12-21 08:29:39 +08: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:
parent
02703ff227
commit
5c6d9fc4b2
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user