From e434ad39ae7316bcf35fd578dd34ad7e1ff3c25f Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter_e@gmx.net>
Date: Mon, 6 Mar 2017 09:33:26 -0500
Subject: [PATCH] Reorder the asynchronous libpq calls for replication
 connection

Per libpq documentation, the initial state must be
PGRES_POLLING_WRITING.  Failing to do that appears to cause some issues
on some Windows systems.

From: Petr Jelinek <petr.jelinek@2ndquadrant.com>
---
 .../libpqwalreceiver/libpqwalreceiver.c        | 18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)

diff --git a/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c b/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c
index 048d2aaa76..ebadf3680f 100644
--- a/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c
+++ b/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c
@@ -155,12 +155,16 @@ libpqrcv_connect(const char *conninfo, bool logical, const char *appname,
 		return NULL;
 	}
 
-	/* Poll connection. */
-	do
+	/*
+	 * Poll connection until we have OK or FAILED status.
+	 *
+	 * Note that the initial state after PQconnectStartParams is
+	 * PGRES_POLLING_WRITING.
+	 */
+	for (status = PGRES_POLLING_WRITING;
+		 status != PGRES_POLLING_OK && status != PGRES_POLLING_FAILED;
+		 status = PQconnectPoll(conn->streamConn))
 	{
-		/* Determine current state of the connection. */
-		status = PQconnectPoll(conn->streamConn);
-
 		/* Sleep a bit if waiting for socket. */
 		if (status == PGRES_POLLING_READING ||
 			status == PGRES_POLLING_WRITING)
@@ -188,9 +192,7 @@ libpqrcv_connect(const char *conninfo, bool logical, const char *appname,
 			if (rc & WL_LATCH_SET)
 				CHECK_FOR_INTERRUPTS();
 		}
-
-		/* Otherwise loop until we have OK or FAILED status. */
-	} while (status != PGRES_POLLING_OK && status != PGRES_POLLING_FAILED);
+	}
 
 	if (PQstatus(conn->streamConn) != CONNECTION_OK)
 	{
-- 
2.50.1