From 99709c9b908eba99ecd787c4dc757f71edd98d87 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Tue, 31 Aug 2021 10:19:38 +0900 Subject: [PATCH] Refactor one use of IDENTIFY_SYSTEM in WAL streaming code of pg_basebackup 0c013e0 has done a large refactoring to unify all the code paths using replication commands, but forgot one code path doing WAL streaming that checks the validity of a cluster connecting to with IDENTIFY_SYSTEM. There is a generic routine able to handle that, so make use of it in this code path. This impacts pg_receivewal and pg_basebackup. Author: Bharath Rupireddy Discussion: https://postgr.es/m/CALj2ACVKKYUMC8GE72Y7BP9g1batrrq3sEwUh+1_i2krWZC_2Q@mail.gmail.com --- src/bin/pg_basebackup/receivelog.c | 32 +++++++++++++----------------- 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/src/bin/pg_basebackup/receivelog.c b/src/bin/pg_basebackup/receivelog.c index ec53b6837e..9601fd8d9c 100644 --- a/src/bin/pg_basebackup/receivelog.c +++ b/src/bin/pg_basebackup/receivelog.c @@ -482,36 +482,32 @@ ReceiveXlogStream(PGconn *conn, StreamCtl *stream) if (stream->sysidentifier != NULL) { - /* Validate system identifier hasn't changed */ - res = PQexec(conn, "IDENTIFY_SYSTEM"); - if (PQresultStatus(res) != PGRES_TUPLES_OK) + char *sysidentifier = NULL; + TimeLineID servertli; + + /* + * Get the server system identifier and timeline, and validate them. + */ + if (!RunIdentifySystem(conn, &sysidentifier, &servertli, NULL, NULL)) { - pg_log_error("could not send replication command \"%s\": %s", - "IDENTIFY_SYSTEM", PQerrorMessage(conn)); - PQclear(res); + pg_free(sysidentifier); return false; } - if (PQntuples(res) != 1 || PQnfields(res) < 3) - { - pg_log_error("could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields", - PQntuples(res), PQnfields(res), 1, 3); - PQclear(res); - return false; - } - if (strcmp(stream->sysidentifier, PQgetvalue(res, 0, 0)) != 0) + + if (strcmp(stream->sysidentifier, sysidentifier) != 0) { pg_log_error("system identifier does not match between base backup and streaming connection"); - PQclear(res); + pg_free(sysidentifier); return false; } - if (stream->timeline > atoi(PQgetvalue(res, 0, 1))) + pg_free(sysidentifier); + + if (stream->timeline > servertli) { pg_log_error("starting timeline %u is not present in the server", stream->timeline); - PQclear(res); return false; } - PQclear(res); } /*