mirror of
https://github.com/postgres/postgres.git
synced 2026-10-23 13:29:09 +03:00
Report single-page checksum failures in pg_stat_database
Base backups reported checksum failures to pg_stat_database only for
files with more than one failing page. Commit 6b9e875f72 placed the
report inside the block emitting the per-file summary WARNING, which
was skipped for a single failure. As a result, a backup failing on
files with one corrupted page each left checksum_failures untouched.
To fix, emit the per-file summary and the pgstat report for any
non-zero failure count. The end-of-backup total WARNING had the same
off-by-one and is now also emitted for a single failure.
Author: Zsolt Parragi <zsolt.parragi@percona.com>
Reviewed-by: Nazir Bilal Yavuz <byavuz81@gmail.com>
Discussion: https://postgr.es/m/CAN4CZFN+Bi6XmaH8zOdMWjoycYFx9nKtOr+dzQf0o-UQ+Rdqmw@mail.gmail.com
Backpatch-through: 14
This commit is contained in:
@@ -641,12 +641,11 @@ perform_base_backup(basebackup_options *opt, bbsink *sink)
|
||||
|
||||
if (total_checksum_failures)
|
||||
{
|
||||
if (total_checksum_failures > 1)
|
||||
ereport(WARNING,
|
||||
(errmsg_plural("%lld total checksum verification failure",
|
||||
"%lld total checksum verification failures",
|
||||
total_checksum_failures,
|
||||
total_checksum_failures)));
|
||||
ereport(WARNING,
|
||||
(errmsg_plural("%lld total checksum verification failure",
|
||||
"%lld total checksum verification failures",
|
||||
total_checksum_failures,
|
||||
total_checksum_failures)));
|
||||
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_DATA_CORRUPTED),
|
||||
@@ -1717,7 +1716,7 @@ sendFile(bbsink *sink, const char *readfilename, const char *tarfilename,
|
||||
|
||||
CloseTransientFile(fd);
|
||||
|
||||
if (checksum_failures > 1)
|
||||
if (checksum_failures > 0)
|
||||
{
|
||||
ereport(WARNING,
|
||||
(errmsg_plural("file \"%s\" has a total of %d checksum verification failure",
|
||||
|
||||
@@ -808,6 +808,13 @@ $node->command_checks_all(
|
||||
'pg_basebackup reports checksum mismatch');
|
||||
rmtree("$tempdir/backup_corrupt");
|
||||
|
||||
# Single failure counted in pg_stat_database.
|
||||
ok( $node->poll_query_until(
|
||||
'postgres',
|
||||
'SELECT checksum_failures = 1 FROM pg_stat_database '
|
||||
. "WHERE datname = 'postgres';"),
|
||||
'checksum failure reported in pg_stat_database');
|
||||
|
||||
# induce further corruption in 5 more blocks
|
||||
$node->stop;
|
||||
for my $i (1 .. 5)
|
||||
@@ -837,6 +844,13 @@ $node->command_checks_all(
|
||||
'pg_basebackup correctly report the total number of checksum mismatches');
|
||||
rmtree("$tempdir/backup_corrupt3");
|
||||
|
||||
# Failures across all the backups.
|
||||
ok( $node->poll_query_until(
|
||||
'postgres',
|
||||
'SELECT checksum_failures = 14 FROM pg_stat_database '
|
||||
. "WHERE datname = 'postgres';"),
|
||||
'checksum failures accumulated in pg_stat_database');
|
||||
|
||||
# do not verify checksums, should return ok
|
||||
$node->command_ok(
|
||||
[
|
||||
|
||||
Reference in New Issue
Block a user