mirror of
https://github.com/postgres/postgres.git
synced 2025-10-21 02:52:47 +03:00
pg_checksums: Use new routine to retrieve data of PG_VERSION
Previously, attempting to use pg_checksums on a cluster with a control
file whose version does not match with what thetool is able to support
would lead to the following error:
pg_checksums: error: pg_control CRC value is incorrect
This is confusing, because it would look like the control file is
corrupted. However, the contents of the control file are correct,
pg_checksums not being able to understand how the past control file is
shaped.
This commit adds a check based on PG_VERSION, using the facility added
by cd0be131ba
, using the same error message as some of the other
frontend tools. A note is added in the documentation about the major
version requirement.
Author: Michael Banck <mbanck@gmx.net>
Discussion: https://postgr.es/m/68f1ff21.170a0220.2c9b5f.4df5@mx.google.com
This commit is contained in:
@@ -247,5 +247,9 @@ PostgreSQL documentation
|
|||||||
remains unchanged, and <application>pg_checksums</application> can be
|
remains unchanged, and <application>pg_checksums</application> can be
|
||||||
re-run to perform the same operation.
|
re-run to perform the same operation.
|
||||||
</para>
|
</para>
|
||||||
|
<para>
|
||||||
|
The target cluster must have the same major version as
|
||||||
|
<application>pg_checksums</application>.
|
||||||
|
</para>
|
||||||
</refsect1>
|
</refsect1>
|
||||||
</refentry>
|
</refentry>
|
||||||
|
@@ -25,6 +25,7 @@
|
|||||||
#include "common/logging.h"
|
#include "common/logging.h"
|
||||||
#include "common/relpath.h"
|
#include "common/relpath.h"
|
||||||
#include "fe_utils/option_utils.h"
|
#include "fe_utils/option_utils.h"
|
||||||
|
#include "fe_utils/version.h"
|
||||||
#include "getopt_long.h"
|
#include "getopt_long.h"
|
||||||
#include "pg_getopt.h"
|
#include "pg_getopt.h"
|
||||||
#include "storage/bufpage.h"
|
#include "storage/bufpage.h"
|
||||||
@@ -448,6 +449,8 @@ main(int argc, char *argv[])
|
|||||||
int c;
|
int c;
|
||||||
int option_index;
|
int option_index;
|
||||||
bool crc_ok;
|
bool crc_ok;
|
||||||
|
uint32 major_version;
|
||||||
|
char *version_str;
|
||||||
|
|
||||||
pg_logging_init(argv[0]);
|
pg_logging_init(argv[0]);
|
||||||
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_checksums"));
|
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_checksums"));
|
||||||
@@ -543,6 +546,20 @@ main(int argc, char *argv[])
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Retrieve the contents of this cluster's PG_VERSION. We require
|
||||||
|
* compatibility with the same major version as the one this tool is
|
||||||
|
* compiled with.
|
||||||
|
*/
|
||||||
|
major_version = GET_PG_MAJORVERSION_NUM(get_pg_version(DataDir, &version_str));
|
||||||
|
if (major_version != PG_MAJORVERSION_NUM)
|
||||||
|
{
|
||||||
|
pg_log_error("data directory is of wrong version");
|
||||||
|
pg_log_error_detail("File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\".",
|
||||||
|
"PG_VERSION", version_str, PG_MAJORVERSION);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
/* Read the control file and check compatibility */
|
/* Read the control file and check compatibility */
|
||||||
ControlFile = get_controlfile(DataDir, &crc_ok);
|
ControlFile = get_controlfile(DataDir, &crc_ok);
|
||||||
if (!crc_ok)
|
if (!crc_ok)
|
||||||
|
Reference in New Issue
Block a user