aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Paquier <michael@paquier.xyz>2021-08-31 10:19:38 +0900
committerMichael Paquier <michael@paquier.xyz>2021-08-31 10:19:38 +0900
commit99709c9b908eba99ecd787c4dc757f71edd98d87 (patch)
tree6dde32ca7065f5f34a9030c5b96149cc1e51ebd8 /src
parent961dd7565726a507d4551f7ea54ad888fc6ee93a (diff)
downloadpostgresql-99709c9b908eba99ecd787c4dc757f71edd98d87.tar.gz
postgresql-99709c9b908eba99ecd787c4dc757f71edd98d87.zip
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
Diffstat (limited to 'src')
-rw-r--r--src/bin/pg_basebackup/receivelog.c32
1 files changed, 14 insertions, 18 deletions
diff --git a/src/bin/pg_basebackup/receivelog.c b/src/bin/pg_basebackup/receivelog.c
index ec53b6837e7..9601fd8d9cf 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)
- {
- pg_log_error("could not send replication command \"%s\": %s",
- "IDENTIFY_SYSTEM", PQerrorMessage(conn));
- PQclear(res);
- return false;
- }
- if (PQntuples(res) != 1 || PQnfields(res) < 3)
+ 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 identify system: got %d rows and %d fields, expected %d rows and %d or more fields",
- PQntuples(res), PQnfields(res), 1, 3);
- PQclear(res);
+ pg_free(sysidentifier);
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);
}
/*