From 26c8efbf59a456f4ad8a87b504180449efe1cd69 Mon Sep 17 00:00:00 2001 From: Vignesh Date: Wed, 30 Apr 2025 21:38:33 +0530 Subject: [PATCH] Fix race condition after ALTER SUBSCRIPTION SET PUBLICATION Previously, after executing ALTER SUBSCRIPTION tap_sub SET PUBLICATION, we did not wait for the new walsender process to restart. As a result, an INSERT executed immediately after the ALTER could be decoded and the confirmed flush lsn is advanced. This could cause replication to resume from a point after the INSERT. In such cases, we miss the expected warning about the missing publication. To fix this, we now ensure that the walsender has restarted before continuing after ALTER SUBSCRIPTION. --- src/test/subscription/t/024_add_drop_pub.pl | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/test/subscription/t/024_add_drop_pub.pl b/src/test/subscription/t/024_add_drop_pub.pl index b594941c7cb..e995d8b3839 100644 --- a/src/test/subscription/t/024_add_drop_pub.pl +++ b/src/test/subscription/t/024_add_drop_pub.pl @@ -91,10 +91,21 @@ is($result, qq(20|1|10), 'check initial data is copied to subscriber'); $node_publisher->safe_psql('postgres', "CREATE TABLE tab_3 (a int)"); $node_subscriber->safe_psql('postgres', "CREATE TABLE tab_3 (a int)"); +my $oldpid = $node_publisher->safe_psql('postgres', + "SELECT pid FROM pg_stat_replication WHERE application_name = 'tap_sub' AND state = 'streaming';" +); + # Set the subscription with a missing publication $node_subscriber->safe_psql('postgres', "ALTER SUBSCRIPTION tap_sub SET PUBLICATION tap_pub_3"); +# Wait for the walsender to restart after altering the subscription +$node_publisher->poll_query_until('postgres', + "SELECT pid != $oldpid FROM pg_stat_replication WHERE application_name = 'tap_sub' AND state = 'streaming';" + ) + or die + "Timed out while waiting for apply worker to restart after altering the subscription"; + my $offset = -s $node_publisher->logfile; $node_publisher->safe_psql('postgres',"INSERT INTO tab_3 values(1)"); -- 2.43.0