Question about 0001. In the CONNECTION_SETENV state, you end by falling through to the CONNECTION_CHECK_TARGET case; but in that switch it seems a bit unnatural to do that. I think doing "goto keep_trying" is another way of doing the same thing, but more in line with what every other piece of code does.
-- Álvaro Herrera https://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
>From 30fbb4a913697fe35a195dd41ddd5bcfeec53c0e Mon Sep 17 00:00:00 2001 From: Alvaro Herrera <alvhe...@alvh.no-ip.org> Date: Fri, 6 Sep 2019 16:26:01 -0400 Subject: [PATCH] Restructure the code to remove duplicate code The duplicate code logic of checking for the server version before issuing the SHOW transaction_read_only to find out whether the server is read-write or not is restructured under a new connection status, so that duplicate code is removed. This is required for the next set of patches Author: Hari Babu Kommi Discussion: https://postgr.es/m/cajrrpge_qgdbbn+ybgevpd+ylhxxjtruzk6rmtmhqrfig+3...@mail.gmail.com --- src/interfaces/libpq/fe-connect.c | 87 ++++++++++++------------------- src/interfaces/libpq/libpq-fe.h | 3 +- 2 files changed, 34 insertions(+), 56 deletions(-) diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c index f03d43376c..91316709a5 100644 --- a/src/interfaces/libpq/fe-connect.c +++ b/src/interfaces/libpq/fe-connect.c @@ -3434,6 +3434,13 @@ keep_going: /* We will come back to here until there is return PGRES_POLLING_WRITING; } + /* Almost there now ... */ + conn->status = CONNECTION_CHECK_TARGET; + goto keep_going; + } + + case CONNECTION_CHECK_TARGET: + { /* * If a read-write connection is required, see if we have one. * @@ -3476,67 +3483,37 @@ keep_going: /* We will come back to here until there is } case CONNECTION_SETENV: - - /* - * Do post-connection housekeeping (only needed in protocol 2.0). - * - * We pretend that the connection is OK for the duration of these - * queries. - */ - conn->status = CONNECTION_OK; - - switch (pqSetenvPoll(conn)) { - case PGRES_POLLING_OK: /* Success */ - break; - - case PGRES_POLLING_READING: /* Still going */ - conn->status = CONNECTION_SETENV; - return PGRES_POLLING_READING; - - case PGRES_POLLING_WRITING: /* Still going */ - conn->status = CONNECTION_SETENV; - return PGRES_POLLING_WRITING; - - default: - goto error_return; - } - - /* - * If a read-write connection is required, see if we have one. - * (This should match the stanza in the CONNECTION_AUTH_OK case - * above.) - * - * Servers before 7.4 lack the transaction_read_only GUC, but by - * the same token they don't have any read-only mode, so we may - * just skip the test in that case. - */ - if (conn->sversion >= 70400 && - conn->target_session_attrs != NULL && - strcmp(conn->target_session_attrs, "read-write") == 0) - { - if (!saveErrorMessage(conn, &savedMessage)) - goto error_return; - + /* + * Do post-connection housekeeping (only needed in protocol 2.0). + * + * We pretend that the connection is OK for the duration of these + * queries. + */ conn->status = CONNECTION_OK; - if (!PQsendQuery(conn, - "SHOW transaction_read_only")) + + switch (pqSetenvPoll(conn)) { - restoreErrorMessage(conn, &savedMessage); - goto error_return; + case PGRES_POLLING_OK: /* Success */ + break; + + case PGRES_POLLING_READING: /* Still going */ + conn->status = CONNECTION_SETENV; + return PGRES_POLLING_READING; + + case PGRES_POLLING_WRITING: /* Still going */ + conn->status = CONNECTION_SETENV; + return PGRES_POLLING_WRITING; + + default: + goto error_return; } - conn->status = CONNECTION_CHECK_WRITABLE; - restoreErrorMessage(conn, &savedMessage); - return PGRES_POLLING_READING; + + /* Almost there now ... */ + conn->status = CONNECTION_CHECK_TARGET; + goto keep_going; } - /* We can release the address list now. */ - release_conn_addrinfo(conn); - - /* We are open for business! */ - conn->status = CONNECTION_OK; - return PGRES_POLLING_OK; - case CONNECTION_CONSUME: { conn->status = CONNECTION_OK; diff --git a/src/interfaces/libpq/libpq-fe.h b/src/interfaces/libpq/libpq-fe.h index 22c4954f2b..5f65db30e4 100644 --- a/src/interfaces/libpq/libpq-fe.h +++ b/src/interfaces/libpq/libpq-fe.h @@ -67,7 +67,8 @@ typedef enum * connection. */ CONNECTION_CONSUME, /* Wait for any pending message and consume * them. */ - CONNECTION_GSS_STARTUP /* Negotiating GSSAPI. */ + CONNECTION_GSS_STARTUP, /* Negotiating GSSAPI. */ + CONNECTION_CHECK_TARGET /* Check if we have a proper target connection */ } ConnStatusType; typedef enum -- 2.17.1