summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFujii Masao2026-08-27 14:57:47 +0000
committerFujii Masao2026-08-27 14:57:47 +0000
commit321ec8ee1c016fde47aeebb9e0b3882bcc4c6b97 (patch)
tree70dc54ed74c9af3ed970abf91bf0bb669e10ce86
parentba2ea49b3cba05a948d38afe6191a4338e063dce (diff)
Stabilize 019_replslot_limit
The test assumed that advancing WAL would lead to a checkpoint that invalidates the obsolete replication slot. If a checkpoint that started before the WAL switch completes first, the following checkpoint can be skipped as idle, so the expected walsender termination is not logged. Force a CHECKPOINT in a background psql session after advancing WAL, so the slot invalidation is exercised deterministically. This has been observed on buildfarm members alligator and partridge: https://buildfarm.postgresql.org/cgi-bin/show_log.pl?nm=alligator&dt=2024-12-13%2001%3A24%3A58 https://buildfarm.postgresql.org/cgi-bin/show_log.pl?nm=partridge&dt=2026-08-06%2018%3A00%3A11 Backpatch to all supported versions. Reported-by: Alexander Lakhin <exclusion@gmail.com> Author: Hayato Kuroda <kuroda.hayato@fujitsu.com> Reviewed-by: Alexander Lakhin <exclusion@gmail.com> Reviewed-by: Fujii Masao <masao.fujii@gmail.com> Discussion: https://postgr.es/m/0b07ead5-a5da-445e-9698-a7d340708bdf@gmail.com Backpatch-through: 14
-rw-r--r--src/test/recovery/t/019_replslot_limit.pl13
1 files changed, 11 insertions, 2 deletions
diff --git a/src/test/recovery/t/019_replslot_limit.pl b/src/test/recovery/t/019_replslot_limit.pl
index 1eec98f2c9e..e78b548b213 100644
--- a/src/test/recovery/t/019_replslot_limit.pl
+++ b/src/test/recovery/t/019_replslot_limit.pl
@@ -314,8 +314,6 @@ my $node_primary3 = get_new_node('primary3');
$node_primary3->init(allows_streaming => 1, extra => ['--wal-segsize=1']);
$node_primary3->append_conf(
'postgresql.conf', qq(
- min_wal_size = 2MB
- max_wal_size = 2MB
log_checkpoints = yes
max_slot_wal_keep_size = 1MB
));
@@ -345,6 +343,16 @@ $logstart = get_log_size($node_primary3);
kill 'STOP', $senderpid, $receiverpid;
advance_wal($node_primary3, 2);
+# Run CHECKPOINT in the background. It is expected to reach slot
+# invalidation, signal the stopped walsender, and then wait until the
+# walsender releases the slot.
+my $checkpoint = $node_primary3->background_psql('postgres');
+$checkpoint->query_until(
+ qr/starting_checkpoint/, q(
+ \echo starting_checkpoint
+ CHECKPOINT;
+));
+
my $max_attempts = $TestLib::timeout_default;
while ($max_attempts-- >= 0)
{
@@ -366,6 +374,7 @@ $node_primary3->poll_query_until('postgres',
"SELECT wal_status FROM pg_replication_slots WHERE slot_name = 'rep3'",
"lost")
or die "timed out waiting for slot to be lost";
+$checkpoint->quit;
$max_attempts = $TestLib::timeout_default;
while ($max_attempts-- >= 0)