From: Magnus Hagander <magnus@hagander.net>
Date: Mon, 11 Jun 2012 13:07:55 +0000 (+0200)
Subject: Prevent non-streaming replication connections from being selected sync slave
X-Git-Tag: REL9_2_BETA3~113
X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3595a71e9ce90a2d4c812a9bb34dc24ffc492c2b;p=postgresql

Prevent non-streaming replication connections from being selected sync slave

This prevents a pg_basebackup backup session that just does a base
backup (no xlog involved at all) from becoming the synchronous slave
and thus blocking all access while it runs.

Also fixes the problem when a higher priority slave shows up it would
become the sync standby before it has reached the STREAMING state, by
making sure we can only switch to a walsender that's actually STREAMING.

Fujii Masao
---

diff --git a/src/backend/replication/syncrep.c b/src/backend/replication/syncrep.c
index a2ae8700d1..a3319642c6 100644
--- a/src/backend/replication/syncrep.c
+++ b/src/backend/replication/syncrep.c
@@ -397,6 +397,7 @@ SyncRepReleaseWaiters(void)
 		volatile WalSnd *walsnd = &walsndctl->walsnds[i];
 
 		if (walsnd->pid != 0 &&
+			walsnd->state == WALSNDSTATE_STREAMING &&
 			walsnd->sync_standby_priority > 0 &&
 			(priority == 0 ||
 			 priority > walsnd->sync_standby_priority))