postgres.git / summary / log / commit / refs

commit    a5447a2deaca65c69f1838240f6bdb3ff85c9577
Author:   Daniel Gustafsson <dgustafsson@postgresql.org>
Date:     Mon Sep 28 15:46:56 2026 +0000

    Fix WAL file selection in 013_rewind test
    
    Without an explicit WAL filename, pg_waldump determines the segment
    size from the first WAL-named directory entry.  A preallocated
    segment with an uninitialized header can make this fail before the
    checkpoint is read.
    
    Pass the WAL filename recorded in backup_label to avoid depending
    on directory enumeration order.  Use command_like() so command
    failures and stderr are checked rather than appearing only as an
    empty-output mismatch.
    
    This was independently reported by Nazir Bilal Yavuz and Alexander
    Lakhin.
    
    Author: Nazir Bilal Yavuz <byavuz81@gmail.com>
    Reported-by: Nazir Bilal Yavuz <byavuz81@gmail.com>
    Reported-by: Alexander Lakhin <exclusion@gmail.com>
    Reviewed-by: Zsolt Parragi <zsolt.parragi@percona.com>
    Reviewed-by: Daniel Gustafsson <daniel@yesql.se>
    Discussion: https://postgr.es/m/CAN55FZ1Yak_xBqMaDQsD7atpBkGLEkF-DKXcs3nLHM1Uq4YRew%40mail.gmail.com
    Discussion: https://postgr.es/m/ffd837c5-dc22-4db1-a2d8-b623cbe9b30c@gmail.com


src/test/modules/test_checksums/t/013_rewind.pl | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/test/modules/test_checksums/t/013_rewind.pl b/src/test/modules/test_checksums/t/013_rewind.pl index 21715ace9f3..2cf411e9115 100644 --- a/src/test/modules/test_checksums/t/013_rewind.pl +++ b/src/test/modules/test_checksums/t/013_rewind.pl @@ -151,15 +151,27 @@ $backup_label =~ /^CHECKPOINT LOCATION: ([0-9A-F\/]+)$/m or die "checkpoint location missing from backup_label"; is($1, $shutdown_ckpt, 'replay starts at the switchover checkpoint'); -($stdout, $stderr) = run_command( +# Specify the WAL file so that pg_waldump does not try to determine the +# segment size from an arbitrary, possibly preallocated, file in pg_wal. +# This test would fail if the checkpoint record is straddling two WAL +# segments, if this is ever observed then support for reading the next +# segment as well. +$backup_label =~ + /^START WAL LOCATION: [0-9A-F\/]+ \(file ([0-9A-F]{8})[0-9A-F]{16}\)$/m + or die "WAL file name missing from backup_label"; +my $shutdown_wal = $1 + . $node_b->safe_psql('postgres', + "SELECT substr(pg_walfile_name('$shutdown_ckpt'), 9);"); + +command_like( [ 'pg_waldump', '-p' => $node_a->data_dir . '/pg_wal', - '-t' => 1, '-s' => $shutdown_ckpt, '-n' => 1, - ]); -like($stdout, qr/CHECKPOINT_SHUTDOWN/, + $shutdown_wal, + ], + qr/CHECKPOINT_SHUTDOWN/, 'last common checkpoint is a shutdown checkpoint'); # pg_rewind keeps the target's own checksum state in the control file it [parent: 5f76ed5d6baa]