1
0
mirror of https://github.com/postgres/postgres.git synced 2026-10-23 13:29:09 +03:00

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
This commit is contained in:
Daniel Gustafsson
2026-09-28 17:46:56 +02:00
parent 5f76ed5d6b
commit a5447a2dea

View File

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