Rework options of pg_checksums options for filenode handling
This makes the tool consistent with the option set of oid2name, which has been historically using -f for filenodes, and has more recently gained long options and --filenode via 1aaf532. Reported-by: Peter Eisentraut Author: Fabien Coelho Discussion: https://postgr.es/m/97045260-fb9e-e145-a950-cf7d28c4eaea@2ndquadrant.com
This commit is contained in:
parent
13002bf0bc
commit
fc115d0f9f
@ -100,6 +100,17 @@ PostgreSQL documentation
|
|||||||
</listitem>
|
</listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>-f <replaceable>filenode</replaceable></option></term>
|
||||||
|
<term><option>--filenode=<replaceable>filenode</replaceable></option></term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Only validate checksums in the relation with filenode
|
||||||
|
<replaceable>filenode</replaceable>.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><option>-N</option></term>
|
<term><option>-N</option></term>
|
||||||
<term><option>--no-sync</option></term>
|
<term><option>--no-sync</option></term>
|
||||||
@ -116,25 +127,6 @@ PostgreSQL documentation
|
|||||||
</listitem>
|
</listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry>
|
|
||||||
<term><option>-v</option></term>
|
|
||||||
<term><option>--verbose</option></term>
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Enable verbose output. Lists all checked files.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
</varlistentry>
|
|
||||||
|
|
||||||
<varlistentry>
|
|
||||||
<term><option>-r <replaceable>relfilenode</replaceable></option></term>
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Only validate checksums in the relation with specified relfilenode.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
</varlistentry>
|
|
||||||
|
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><option>-P</option></term>
|
<term><option>-P</option></term>
|
||||||
<term><option>--progress</option></term>
|
<term><option>--progress</option></term>
|
||||||
@ -146,6 +138,16 @@ PostgreSQL documentation
|
|||||||
</listitem>
|
</listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>-v</option></term>
|
||||||
|
<term><option>--verbose</option></term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Enable verbose output. Lists all checked files.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><option>-V</option></term>
|
<term><option>-V</option></term>
|
||||||
<term><option>--version</option></term>
|
<term><option>--version</option></term>
|
||||||
|
@ -36,7 +36,7 @@ static int64 blocks = 0;
|
|||||||
static int64 badblocks = 0;
|
static int64 badblocks = 0;
|
||||||
static ControlFileData *ControlFile;
|
static ControlFileData *ControlFile;
|
||||||
|
|
||||||
static char *only_relfilenode = NULL;
|
static char *only_filenode = NULL;
|
||||||
static bool do_sync = true;
|
static bool do_sync = true;
|
||||||
static bool verbose = false;
|
static bool verbose = false;
|
||||||
static bool showprogress = false;
|
static bool showprogress = false;
|
||||||
@ -80,10 +80,10 @@ usage(void)
|
|||||||
printf(_(" -c, --check check data checksums (default)\n"));
|
printf(_(" -c, --check check data checksums (default)\n"));
|
||||||
printf(_(" -d, --disable disable data checksums\n"));
|
printf(_(" -d, --disable disable data checksums\n"));
|
||||||
printf(_(" -e, --enable enable data checksums\n"));
|
printf(_(" -e, --enable enable data checksums\n"));
|
||||||
|
printf(_(" -f, --filenode=FILENODE check only relation with specified filenode\n"));
|
||||||
printf(_(" -N, --no-sync do not wait for changes to be written safely to disk\n"));
|
printf(_(" -N, --no-sync do not wait for changes to be written safely to disk\n"));
|
||||||
printf(_(" -P, --progress show progress information\n"));
|
printf(_(" -P, --progress show progress information\n"));
|
||||||
printf(_(" -v, --verbose output verbose messages\n"));
|
printf(_(" -v, --verbose output verbose messages\n"));
|
||||||
printf(_(" -r RELFILENODE check only relation with specified relfilenode\n"));
|
|
||||||
printf(_(" -V, --version output version information, then exit\n"));
|
printf(_(" -V, --version output version information, then exit\n"));
|
||||||
printf(_(" -?, --help show this help, then exit\n"));
|
printf(_(" -?, --help show this help, then exit\n"));
|
||||||
printf(_("\nIf no data directory (DATADIR) is specified, "
|
printf(_("\nIf no data directory (DATADIR) is specified, "
|
||||||
@ -318,7 +318,7 @@ scan_directory(const char *basedir, const char *subdir, bool sizeonly)
|
|||||||
/*
|
/*
|
||||||
* Cut off at the segment boundary (".") to get the segment number
|
* Cut off at the segment boundary (".") to get the segment number
|
||||||
* in order to mix it into the checksum. Then also cut off at the
|
* in order to mix it into the checksum. Then also cut off at the
|
||||||
* fork boundary, to get the relfilenode the file belongs to for
|
* fork boundary, to get the filenode the file belongs to for
|
||||||
* filtering.
|
* filtering.
|
||||||
*/
|
*/
|
||||||
strlcpy(fnonly, de->d_name, sizeof(fnonly));
|
strlcpy(fnonly, de->d_name, sizeof(fnonly));
|
||||||
@ -339,8 +339,8 @@ scan_directory(const char *basedir, const char *subdir, bool sizeonly)
|
|||||||
if (forkpath != NULL)
|
if (forkpath != NULL)
|
||||||
*forkpath++ = '\0';
|
*forkpath++ = '\0';
|
||||||
|
|
||||||
if (only_relfilenode && strcmp(only_relfilenode, fnonly) != 0)
|
if (only_filenode && strcmp(only_filenode, fnonly) != 0)
|
||||||
/* Relfilenode not to be included */
|
/* filenode not to be included */
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
dirsize += st.st_size;
|
dirsize += st.st_size;
|
||||||
@ -371,6 +371,7 @@ main(int argc, char *argv[])
|
|||||||
{"pgdata", required_argument, NULL, 'D'},
|
{"pgdata", required_argument, NULL, 'D'},
|
||||||
{"disable", no_argument, NULL, 'd'},
|
{"disable", no_argument, NULL, 'd'},
|
||||||
{"enable", no_argument, NULL, 'e'},
|
{"enable", no_argument, NULL, 'e'},
|
||||||
|
{"filenode", required_argument, NULL, 'f'},
|
||||||
{"no-sync", no_argument, NULL, 'N'},
|
{"no-sync", no_argument, NULL, 'N'},
|
||||||
{"progress", no_argument, NULL, 'P'},
|
{"progress", no_argument, NULL, 'P'},
|
||||||
{"verbose", no_argument, NULL, 'v'},
|
{"verbose", no_argument, NULL, 'v'},
|
||||||
@ -400,7 +401,7 @@ main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
while ((c = getopt_long(argc, argv, "cD:deNPr:v", long_options, &option_index)) != -1)
|
while ((c = getopt_long(argc, argv, "cD:deNPf:v", long_options, &option_index)) != -1)
|
||||||
{
|
{
|
||||||
switch (c)
|
switch (c)
|
||||||
{
|
{
|
||||||
@ -413,6 +414,14 @@ main(int argc, char *argv[])
|
|||||||
case 'e':
|
case 'e':
|
||||||
mode = PG_MODE_ENABLE;
|
mode = PG_MODE_ENABLE;
|
||||||
break;
|
break;
|
||||||
|
case 'f':
|
||||||
|
if (atoi(optarg) == 0)
|
||||||
|
{
|
||||||
|
pg_log_error("invalid filenode specification, must be numeric: %s", optarg);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
only_filenode = pstrdup(optarg);
|
||||||
|
break;
|
||||||
case 'N':
|
case 'N':
|
||||||
do_sync = false;
|
do_sync = false;
|
||||||
break;
|
break;
|
||||||
@ -422,14 +431,6 @@ main(int argc, char *argv[])
|
|||||||
case 'D':
|
case 'D':
|
||||||
DataDir = optarg;
|
DataDir = optarg;
|
||||||
break;
|
break;
|
||||||
case 'r':
|
|
||||||
if (atoi(optarg) == 0)
|
|
||||||
{
|
|
||||||
pg_log_error("invalid relfilenode specification, must be numeric: %s", optarg);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
only_relfilenode = pstrdup(optarg);
|
|
||||||
break;
|
|
||||||
case 'P':
|
case 'P':
|
||||||
showprogress = true;
|
showprogress = true;
|
||||||
break;
|
break;
|
||||||
@ -465,10 +466,10 @@ main(int argc, char *argv[])
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Relfilenode checking only works in --check mode */
|
/* filenode checking only works in --check mode */
|
||||||
if (mode != PG_MODE_CHECK && only_relfilenode)
|
if (mode != PG_MODE_CHECK && only_filenode)
|
||||||
{
|
{
|
||||||
pg_log_error("relfilenode option only possible with --check");
|
pg_log_error("--filenode option only possible with --check");
|
||||||
fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
|
fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
|
||||||
progname);
|
progname);
|
||||||
exit(1);
|
exit(1);
|
||||||
|
@ -43,7 +43,7 @@ sub check_relation_corruption
|
|||||||
[
|
[
|
||||||
'pg_checksums', '--check',
|
'pg_checksums', '--check',
|
||||||
'-D', $pgdata,
|
'-D', $pgdata,
|
||||||
'-r', $relfilenode_corrupted
|
'--filenode', $relfilenode_corrupted
|
||||||
],
|
],
|
||||||
"succeeds for single relfilenode on tablespace $tablespace with offline cluster"
|
"succeeds for single relfilenode on tablespace $tablespace with offline cluster"
|
||||||
);
|
);
|
||||||
@ -59,7 +59,7 @@ sub check_relation_corruption
|
|||||||
[
|
[
|
||||||
'pg_checksums', '--check',
|
'pg_checksums', '--check',
|
||||||
'-D', $pgdata,
|
'-D', $pgdata,
|
||||||
'-r', $relfilenode_corrupted
|
'--filenode', $relfilenode_corrupted
|
||||||
],
|
],
|
||||||
1,
|
1,
|
||||||
[qr/Bad checksums:.*1/],
|
[qr/Bad checksums:.*1/],
|
||||||
@ -165,10 +165,10 @@ command_ok(
|
|||||||
# Specific relation files cannot be requested when action is --disable
|
# Specific relation files cannot be requested when action is --disable
|
||||||
# or --enable.
|
# or --enable.
|
||||||
command_fails(
|
command_fails(
|
||||||
[ 'pg_checksums', '--disable', '-r', '1234', '-D', $pgdata ],
|
[ 'pg_checksums', '--disable', '--filenode', '1234', '-D', $pgdata ],
|
||||||
"fails when relfilenodes are requested and action is --disable");
|
"fails when relfilenodes are requested and action is --disable");
|
||||||
command_fails(
|
command_fails(
|
||||||
[ 'pg_checksums', '--enable', '-r', '1234', '-D', $pgdata ],
|
[ 'pg_checksums', '--enable', '--filenode', '1234', '-D', $pgdata ],
|
||||||
"fails when relfilenodes are requested and action is --enable");
|
"fails when relfilenodes are requested and action is --enable");
|
||||||
|
|
||||||
# Checks cannot happen with an online cluster
|
# Checks cannot happen with an online cluster
|
||||||
|
Loading…
x
Reference in New Issue
Block a user