postgres.git / summary / log / commit / refs
commit e434ad39ae7316bcf35fd578dd34ad7e1ff3c25f
Author: Peter Eisentraut <peter_e@gmx.net>
Date: Mon Mar 06 14:33:26 2017 +0000
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>
.../replication/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 048d2aaa76b..ebadf3680f6 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)
{
[parent: 6f3a13ff058f]