pg.ddx.io  pgsql-hackers@postgresql.org mailing list archive  
help / color / mirror / Atom feed
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.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

view thread (149+ messages)  latest in thread

Message-ID: <20190909171949.GA31491@alvherre.pgsql>
Permalink:  ../20190909171949.GA31491@alvherre.pgsql/
Also on:    postgresql.org/message-id/20190909171949.GA31491@alvherre.pgsql

 ·  · 

reply

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