From 0591b322f3c572377d7189febbb998efafaba0f2 Mon Sep 17 00:00:00 2001
From: Amit Kapila <akapila@postgresql.org>
Date: Tue, 12 Mar 2024 17:34:58 +0530
Subject: [PATCH v2] Fix a random failure in
 038_save_logical_slots_shutdown.pl.

The test ensures that all the WAL on the publisher is sent to the
subscriber before shutdown by comparing the confirmed_flush_lsn of the
associated slot with the shutdown_checkpoint location. But if the
shutdown_checkpoint location falls into a new page then the check won't
work. So, ensure that that the shutdown_checkpoint WAL record doesn't fall
into a page.

Author: Bharath Rupireddy
Reviewed-by: Vignesh C, Kuroda Hayato, Amit Kapila
Discussion: https://postgr.es/m/CALj2ACVLzH5CN-h9=S26mdRHPuJ9yDLUw70yh4JOiPw03WL0CQ@mail.gmail.com
---
 src/test/recovery/t/038_save_logical_slots_shutdown.pl | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/src/test/recovery/t/038_save_logical_slots_shutdown.pl b/src/test/recovery/t/038_save_logical_slots_shutdown.pl
index 5a4f5dc1d4..931846bae1 100644
--- a/src/test/recovery/t/038_save_logical_slots_shutdown.pl
+++ b/src/test/recovery/t/038_save_logical_slots_shutdown.pl
@@ -60,6 +60,12 @@ $node_subscriber->start;
 $node_publisher->safe_psql('postgres', "CREATE TABLE test_tbl (id int)");
 $node_subscriber->safe_psql('postgres', "CREATE TABLE test_tbl (id int)");
 
+# To avoid a shutdown checkpoint WAL record (that gets generated as part of
+# the publisher restart below) falling into a new page, advance the WAL
+# segment. Otherwise, the confirmed_flush_location and shutdown_checkpoint
+# location won't match.
+$node_publisher->advance_wal(1);
+
 # Insert some data
 $node_publisher->safe_psql('postgres',
 	"INSERT INTO test_tbl VALUES (generate_series(1, 5));");
@@ -81,6 +87,10 @@ is($result, qq(5), "check initial copy was done");
 
 my $offset = -s $node_publisher->logfile;
 
+# Note: Don't insert any data on the publisher that may cause the shutdown
+# checkpoint to fall into a new WAL file. See the comments atop advance_wal()
+# above.
+
 # Restart the publisher to ensure that the slot will be flushed if required
 $node_publisher->restart();
 
-- 
2.28.0.windows.1

