From 49340627f9821e447f135455d942f7d5e96cae6d Mon Sep 17 00:00:00 2001
From: Simon Riggs <simon@2ndQuadrant.com>
Date: Mon, 29 Aug 2016 12:16:18 +0100
Subject: [PATCH] Fix pg_receivexlog --synchronous

Make pg_receivexlog work correctly with --synchronous without slots

Backpatch to 9.5

Gabriele Bartolini, reviewed by Michael Paquier and Simon Riggs
---
 src/bin/pg_basebackup/receivelog.c | 28 +++++++++++++++-------------
 1 file changed, 15 insertions(+), 13 deletions(-)

diff --git a/src/bin/pg_basebackup/receivelog.c b/src/bin/pg_basebackup/receivelog.c
index 595213f042..062730b6b4 100644
--- a/src/bin/pg_basebackup/receivelog.c
+++ b/src/bin/pg_basebackup/receivelog.c
@@ -503,26 +503,28 @@ ReceiveXlogStream(PGconn *conn, StreamCtl *stream)
 	if (!CheckServerVersionForStreaming(conn))
 		return false;
 
+	/*
+	 * Decide whether we want to report the flush position. If we report
+	 * the flush position, the primary will know what WAL we'll
+	 * possibly re-request, and it can then remove older WAL safely.
+	 * We must always do that when we are using slots.
+	 *
+	 * Reporting the flush position makes one eligible as a synchronous
+	 * replica. People shouldn't include generic names in
+	 * synchronous_standby_names, but we've protected them against it so
+	 * far, so let's continue to do so unless specifically requested.
+	 */
 	if (replication_slot != NULL)
 	{
-		/*
-		 * Report the flush position, so the primary can know what WAL we'll
-		 * possibly re-request, and remove older WAL safely.
-		 *
-		 * We only report it when a slot has explicitly been used, because
-		 * reporting the flush position makes one eligible as a synchronous
-		 * replica. People shouldn't include generic names in
-		 * synchronous_standby_names, but we've protected them against it so
-		 * far, so let's continue to do so in the situations when possible. If
-		 * they've got a slot, though, we need to report the flush position,
-		 * so that the master can remove WAL.
-		 */
 		reportFlushPosition = true;
 		sprintf(slotcmd, "SLOT \"%s\" ", replication_slot);
 	}
 	else
 	{
-		reportFlushPosition = false;
+		if (stream->synchronous)
+			reportFlushPosition = true;
+		else
+			reportFlushPosition = false;
 		slotcmd[0] = 0;
 	}
 
-- 
2.40.0