1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-07 00:36:50 +03:00

Make pg_basebackup work with pre-9.3 servers, and add server version check.

A new 'starttli' field was added to the response of BASE_BACKUP command.
Make pg_basebackup tolerate the case that it's missing, so that it still
works with older servers.

Add an explicit check for the server version, so that you get a nicer error
message if you try to use it with a pre-9.1 server.

The streaming protocol message format changed in 9.3, so -X stream still won't
work with pre-9.3 servers. I added a version check to ReceiveXLogStream()
earlier, but write that slightly differently, so that in 9.4, it will still
work with a 9.3 server. (In 9.4, the error message needs to be adjusted to
"9.3 or above", though). Also, if the version check fails, don't retry.
This commit is contained in:
Heikki Linnakangas
2013-03-22 13:02:59 +02:00
parent ea988ee8c8
commit d298b50a3b
5 changed files with 93 additions and 14 deletions

View File

@ -436,6 +436,40 @@ sendFeedback(PGconn *conn, XLogRecPtr blockpos, int64 now, bool replyRequested)
return true;
}
/*
* Check that the server version we're connected to is supported by
* ReceiveXlogStream().
*
* If it's not, an error message is printed to stderr, and false is returned.
*/
bool
CheckServerVersionForStreaming(PGconn *conn)
{
int minServerMajor,
maxServerMajor;
int serverMajor;
/*
* The message format used in streaming replication changed in 9.3, so we
* cannot stream from older servers. And we don't support servers newer
* than the client; it might work, but we don't know, so err on the safe
* side.
*/
minServerMajor = 903;
maxServerMajor = PG_VERSION_NUM / 100;
serverMajor = PQserverVersion(conn) / 100;
if (serverMajor < minServerMajor || serverMajor > maxServerMajor)
{
const char *serverver = PQparameterStatus(conn, "server_version");
fprintf(stderr, _("%s: incompatible server version %s; streaming is only supported with server version %s\n"),
progname,
serverver ? serverver : "'unknown'",
"9.3");
return false;
}
return true;
}
/*
* Receive a log stream starting at the specified position.
*
@ -476,19 +510,11 @@ ReceiveXlogStream(PGconn *conn, XLogRecPtr startpos, uint32 timeline,
XLogRecPtr stoppos;
/*
* The message format used in streaming replication changed in 9.3, so we
* cannot stream from older servers. Don't know if we would work with
* newer versions, but let's not take the risk.
* The caller should've checked the server version already, but doesn't do
* any harm to check it here too.
*/
if (PQserverVersion(conn) / 100 != PG_VERSION_NUM / 100)
{
const char *serverver = PQparameterStatus(conn, "server_version");
fprintf(stderr, _("%s: incompatible server version %s; streaming is only supported with server version %s\n"),
progname,
serverver ? serverver : "'unknown'",
PG_MAJORVERSION);
if (!CheckServerVersionForStreaming(conn))
return false;
}
if (sysidentifier != NULL)
{