From: Alvaro Herrera from 2ndQuadrant <alvherre@alvh.no-ip.org>
To: Haribabu Kommi <kommi.haribabu@gmail.com>
Cc: Tsunakawa, Takayuki <tsunakawa.takay@jp.fujitsu.com>
Cc: Robert Haas <robertmhaas@gmail.com>
Cc: Laurenz Albe <laurenz.albe@cybertec.at>
Cc: Tom Lane <tgl@sss.pgh.pa.us>
Cc: Dave Cramer <pg@fastcrypt.com>
Cc: Jing Wang <jingwangian@gmail.com>
Cc: PostgreSQL-development <pgsql-hackers@postgresql.org>
Subject: Re: Libpq support to connect to standby server as priority
Date: Mon, 9 Sep 2019 14:19:49 -0300
Message-ID: <20190909171949.GA31491@alvherre.pgsql> (raw)
In-Reply-To: <CAJrrPGdNiWmaPbF=85mfU3VpwqNk-p9KLGanOM1nAH8xb-6wkg@mail.gmail.com>
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
Attachments:0001-Restructure-the-code-to-remove-duplicate-code.patch (text/x-diff, 4.4K) download
From 30fbb4a913697fe35a195dd41ddd5bcfeec53c0e Mon Sep 17 00:00:00 2001
From: Alvaro Herrera <alvherre@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+32ag@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.cindex 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.hindex 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
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: pgsql-hackers@postgresql.org
Cc: alvherre@alvh.no-ip.org, kommi.haribabu@gmail.com, tsunakawa.takay@jp.fujitsu.com, robertmhaas@gmail.com, laurenz.albe@cybertec.at, tgl@sss.pgh.pa.us, pg@fastcrypt.com, jingwangian@gmail.com
Subject: Re: Libpq support to connect to standby server as priority
In-Reply-To: <20190909171949.GA31491@alvherre.pgsql>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox