diff options
author | Peter Eisentraut <peter_e@gmx.net> | 2017-03-06 09:33:26 -0500 |
---|---|---|
committer | Peter Eisentraut <peter_e@gmx.net> | 2017-03-06 09:33:26 -0500 |
commit | e434ad39ae7316bcf35fd578dd34ad7e1ff3c25f (patch) | |
tree | 0977af17b9dc2cd670f7ac486d1b69254796b1ba /src | |
parent | 6f3a13ff058f15d565a30c16c0c2cb14cc994e42 (diff) | |
download | postgresql-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.c | 18 |
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) { |