Add walreceiver API to get remote server version

Add a separate walreceiver API function walrcv_server_version() to get
the version of the remote server, instead of doing it as part of
walrcv_identify_system().  This allows the server version to be
available even for uses that don't call IDENTIFY_SYSTEM, and it seems
cleaner anyway.

This is for an upcoming patch, not currently used.

Reviewed-by: Michael Paquier <michael@paquier.xyz>
Discussion: https://www.postgresql.org/message-id/20190115071359.GF1433@paquier.xyz
This commit is contained in:
Peter Eisentraut 2019-03-15 10:16:26 +01:00
parent 4e197bf195
commit 69039fda83
4 changed files with 22 additions and 16 deletions

View File

@ -56,8 +56,8 @@ static char *libpqrcv_get_conninfo(WalReceiverConn *conn);
static void libpqrcv_get_senderinfo(WalReceiverConn *conn, static void libpqrcv_get_senderinfo(WalReceiverConn *conn,
char **sender_host, int *sender_port); char **sender_host, int *sender_port);
static char *libpqrcv_identify_system(WalReceiverConn *conn, static char *libpqrcv_identify_system(WalReceiverConn *conn,
TimeLineID *primary_tli, TimeLineID *primary_tli);
int *server_version); static int libpqrcv_server_version(WalReceiverConn *conn);
static void libpqrcv_readtimelinehistoryfile(WalReceiverConn *conn, static void libpqrcv_readtimelinehistoryfile(WalReceiverConn *conn,
TimeLineID tli, char **filename, TimeLineID tli, char **filename,
char **content, int *len); char **content, int *len);
@ -86,6 +86,7 @@ static WalReceiverFunctionsType PQWalReceiverFunctions = {
libpqrcv_get_conninfo, libpqrcv_get_conninfo,
libpqrcv_get_senderinfo, libpqrcv_get_senderinfo,
libpqrcv_identify_system, libpqrcv_identify_system,
libpqrcv_server_version,
libpqrcv_readtimelinehistoryfile, libpqrcv_readtimelinehistoryfile,
libpqrcv_startstreaming, libpqrcv_startstreaming,
libpqrcv_endstreaming, libpqrcv_endstreaming,
@ -309,8 +310,7 @@ libpqrcv_get_senderinfo(WalReceiverConn *conn, char **sender_host,
* timeline ID of the primary. * timeline ID of the primary.
*/ */
static char * static char *
libpqrcv_identify_system(WalReceiverConn *conn, TimeLineID *primary_tli, libpqrcv_identify_system(WalReceiverConn *conn, TimeLineID *primary_tli)
int *server_version)
{ {
PGresult *res; PGresult *res;
char *primary_sysid; char *primary_sysid;
@ -343,11 +343,18 @@ libpqrcv_identify_system(WalReceiverConn *conn, TimeLineID *primary_tli,
*primary_tli = pg_strtoint32(PQgetvalue(res, 0, 1)); *primary_tli = pg_strtoint32(PQgetvalue(res, 0, 1));
PQclear(res); PQclear(res);
*server_version = PQserverVersion(conn->streamConn);
return primary_sysid; return primary_sysid;
} }
/*
* Thin wrapper around libpq to obtain server version.
*/
static int
libpqrcv_server_version(WalReceiverConn *conn)
{
return PQserverVersion(conn->streamConn);
}
/* /*
* Start streaming WAL data from given streaming options. * Start streaming WAL data from given streaming options.
* *

View File

@ -1674,7 +1674,6 @@ ApplyWorkerMain(Datum main_arg)
RepOriginId originid; RepOriginId originid;
TimeLineID startpointTLI; TimeLineID startpointTLI;
char *err; char *err;
int server_version;
myslotname = MySubscription->slotname; myslotname = MySubscription->slotname;
@ -1708,8 +1707,7 @@ ApplyWorkerMain(Datum main_arg)
* We don't really use the output identify_system for anything but it * We don't really use the output identify_system for anything but it
* does some initializations on the upstream so let's still call it. * does some initializations on the upstream so let's still call it.
*/ */
(void) walrcv_identify_system(wrconn, &startpointTLI, (void) walrcv_identify_system(wrconn, &startpointTLI);
&server_version);
} }

View File

@ -330,7 +330,6 @@ WalReceiverMain(void)
{ {
char *primary_sysid; char *primary_sysid;
char standby_sysid[32]; char standby_sysid[32];
int server_version;
WalRcvStreamOptions options; WalRcvStreamOptions options;
/* /*
@ -338,8 +337,7 @@ WalReceiverMain(void)
* IDENTIFY_SYSTEM replication command. * IDENTIFY_SYSTEM replication command.
*/ */
EnableWalRcvImmediateExit(); EnableWalRcvImmediateExit();
primary_sysid = walrcv_identify_system(wrconn, &primaryTLI, primary_sysid = walrcv_identify_system(wrconn, &primaryTLI);
&server_version);
snprintf(standby_sysid, sizeof(standby_sysid), UINT64_FORMAT, snprintf(standby_sysid, sizeof(standby_sysid), UINT64_FORMAT,
GetSystemIdentifier()); GetSystemIdentifier());

View File

@ -209,8 +209,8 @@ typedef void (*walrcv_get_senderinfo_fn) (WalReceiverConn *conn,
char **sender_host, char **sender_host,
int *sender_port); int *sender_port);
typedef char *(*walrcv_identify_system_fn) (WalReceiverConn *conn, typedef char *(*walrcv_identify_system_fn) (WalReceiverConn *conn,
TimeLineID *primary_tli, TimeLineID *primary_tli);
int *server_version); typedef int (*walrcv_server_version_fn) (WalReceiverConn *conn);
typedef void (*walrcv_readtimelinehistoryfile_fn) (WalReceiverConn *conn, typedef void (*walrcv_readtimelinehistoryfile_fn) (WalReceiverConn *conn,
TimeLineID tli, TimeLineID tli,
char **filename, char **filename,
@ -240,6 +240,7 @@ typedef struct WalReceiverFunctionsType
walrcv_get_conninfo_fn walrcv_get_conninfo; walrcv_get_conninfo_fn walrcv_get_conninfo;
walrcv_get_senderinfo_fn walrcv_get_senderinfo; walrcv_get_senderinfo_fn walrcv_get_senderinfo;
walrcv_identify_system_fn walrcv_identify_system; walrcv_identify_system_fn walrcv_identify_system;
walrcv_server_version_fn walrcv_server_version;
walrcv_readtimelinehistoryfile_fn walrcv_readtimelinehistoryfile; walrcv_readtimelinehistoryfile_fn walrcv_readtimelinehistoryfile;
walrcv_startstreaming_fn walrcv_startstreaming; walrcv_startstreaming_fn walrcv_startstreaming;
walrcv_endstreaming_fn walrcv_endstreaming; walrcv_endstreaming_fn walrcv_endstreaming;
@ -260,8 +261,10 @@ extern PGDLLIMPORT WalReceiverFunctionsType *WalReceiverFunctions;
WalReceiverFunctions->walrcv_get_conninfo(conn) WalReceiverFunctions->walrcv_get_conninfo(conn)
#define walrcv_get_senderinfo(conn, sender_host, sender_port) \ #define walrcv_get_senderinfo(conn, sender_host, sender_port) \
WalReceiverFunctions->walrcv_get_senderinfo(conn, sender_host, sender_port) WalReceiverFunctions->walrcv_get_senderinfo(conn, sender_host, sender_port)
#define walrcv_identify_system(conn, primary_tli, server_version) \ #define walrcv_identify_system(conn, primary_tli) \
WalReceiverFunctions->walrcv_identify_system(conn, primary_tli, server_version) WalReceiverFunctions->walrcv_identify_system(conn, primary_tli)
#define walrcv_server_version(conn) \
WalReceiverFunctions->walrcv_server_version(conn)
#define walrcv_readtimelinehistoryfile(conn, tli, filename, content, size) \ #define walrcv_readtimelinehistoryfile(conn, tli, filename, content, size) \
WalReceiverFunctions->walrcv_readtimelinehistoryfile(conn, tli, filename, content, size) WalReceiverFunctions->walrcv_readtimelinehistoryfile(conn, tli, filename, content, size)
#define walrcv_startstreaming(conn, options) \ #define walrcv_startstreaming(conn, options) \