diff options
| author | Michael Paquier | 2026-08-19 00:51:58 +0000 |
|---|---|---|
| committer | Michael Paquier | 2026-08-19 00:51:58 +0000 |
| commit | 45c88d621ccc8fb7654c8b2e863de3e9d233380b (patch) | |
| tree | ef4388b6e3e3e1431f879742cdd77acd232f2420 | |
| parent | d54d3f5d954e2ffa1df4ad7199847e2bc5afd101 (diff) | |
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 6b9e875f728 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
| -rw-r--r-- | src/backend/backup/basebackup.c | 13 | ||||
| -rw-r--r-- | src/bin/pg_basebackup/t/010_pg_basebackup.pl | 14 |
2 files changed, 20 insertions, 7 deletions
diff --git a/src/backend/backup/basebackup.c b/src/backend/backup/basebackup.c index 9fcd6d135d3..a28b8849c19 100644 --- a/src/backend/backup/basebackup.c +++ b/src/backend/backup/basebackup.c @@ -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", diff --git a/src/bin/pg_basebackup/t/010_pg_basebackup.pl b/src/bin/pg_basebackup/t/010_pg_basebackup.pl index 7f29036f78b..3d2e0ec9a2c 100644 --- a/src/bin/pg_basebackup/t/010_pg_basebackup.pl +++ b/src/bin/pg_basebackup/t/010_pg_basebackup.pl @@ -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( [ |
