1
0
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:
Michael Paquier
2026-08-19 09:51:58 +09:00
parent d54d3f5d95
commit 45c88d621c
2 changed files with 20 additions and 7 deletions

View File

@@ -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",

View File

@@ -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(
[