aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPeter Eisentraut <peter_e@gmx.net>2017-03-06 09:33:26 -0500
committerPeter Eisentraut <peter_e@gmx.net>2017-03-06 09:33:26 -0500
commite434ad39ae7316bcf35fd578dd34ad7e1ff3c25f (patch)
tree0977af17b9dc2cd670f7ac486d1b69254796b1ba /src
parent6f3a13ff058f15d565a30c16c0c2cb14cc994e42 (diff)
downloadpostgresql-e434ad39ae7316bcf35fd578dd34ad7e1ff3c25f.tar.gz
postgresql-e434ad39ae7316bcf35fd578dd34ad7e1ff3c25f.zip
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>
Diffstat (limited to 'src')
-rw-r--r--src/backend/replication/libpqwalreceiver/libpqwalreceiver.c18
1 files 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)
{