summaryrefslogtreecommitdiff
path: root/src/backend/replication/syncrep.c
diff options
context:
space:
mode:
authorMagnus Hagander <magnus@hagander.net>2012-07-04 15:10:46 +0200
committerMagnus Hagander <magnus@hagander.net>2012-07-04 15:24:17 +0200
commitb8aca12d77612007ebde22db14e3971ef664d553 (patch)
treeb02529f17136f108184d261435988f273d2c3d41 /src/backend/replication/syncrep.c
parent119027ec8b8d02c8d70e4916df1b41cde78f674d (diff)
Always treat a standby returning an an invalid flush location as async
This ensures that a standby such as pg_receivexlog will not be selected as sync standby - which would cause the master to block waiting for a location that could never happen. Fujii Masao
Diffstat (limited to 'src/backend/replication/syncrep.c')
-rw-r--r--src/backend/replication/syncrep.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/src/backend/replication/syncrep.c b/src/backend/replication/syncrep.c
index d475e0383d4..10af4e85c13 100644
--- a/src/backend/replication/syncrep.c
+++ b/src/backend/replication/syncrep.c
@@ -379,10 +379,12 @@ SyncRepReleaseWaiters(void)
/*
* If this WALSender is serving a standby that is not on the list of
* potential standbys then we have nothing to do. If we are still starting
- * up or still running base backup, then leave quickly also.
+ * up, still running base backup or the current flush position is still
+ * invalid, then leave quickly also.
*/
if (MyWalSnd->sync_standby_priority == 0 ||
- MyWalSnd->state < WALSNDSTATE_STREAMING)
+ MyWalSnd->state < WALSNDSTATE_STREAMING ||
+ XLogRecPtrIsInvalid(MyWalSnd->flush))
return;
/*
@@ -402,7 +404,8 @@ SyncRepReleaseWaiters(void)
walsnd->state == WALSNDSTATE_STREAMING &&
walsnd->sync_standby_priority > 0 &&
(priority == 0 ||
- priority > walsnd->sync_standby_priority))
+ priority > walsnd->sync_standby_priority) &&
+ !XLogRecPtrIsInvalid(walsnd->flush))
{
priority = walsnd->sync_standby_priority;
syncWalSnd = walsnd;