From e434ad39ae7316bcf35fd578dd34ad7e1ff3c25f Mon Sep 17 00:00:00 2001 From: Peter Eisentraut 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 --- .../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.39.5