From 5b2c297ca4f6e4bdb90a651090314a53a5d034c0 Mon Sep 17 00:00:00 2001 From: ivyazmitinov Date: Mon, 12 Feb 2024 12:05:52 +0100 Subject: [PATCH] Fix flakiness in multi_maintenance_multiple_databases.sql --- .../multi_maintenance_multiple_databases.out | 47 ++++++++++--------- .../multi_maintenance_multiple_databases.sql | 38 ++++++++++----- 2 files changed, 50 insertions(+), 35 deletions(-) diff --git a/src/test/regress/expected/multi_maintenance_multiple_databases.out b/src/test/regress/expected/multi_maintenance_multiple_databases.out index fb5ea712d..9ce129838 100644 --- a/src/test/regress/expected/multi_maintenance_multiple_databases.out +++ b/src/test/regress/expected/multi_maintenance_multiple_databases.out @@ -256,12 +256,31 @@ WHERE state = 'idle' \c - - - :master_port -- Let maintenance do it's work... -SELECT pg_sleep_for('10 seconds'::interval); - pg_sleep_for ---------------------------------------------------------------------- - -(1 row) - +DO +$$ + BEGIN + FOR i IN 0 .. 300 + LOOP + IF i = 300 THEN RAISE 'Waited too long'; END IF; + PERFORM pg_stat_clear_snapshot(); + PERFORM * FROM pg_stat_activity WHERE application_name = 'Citus Maintenance Daemon'; + IF (SELECT count(*) = 0 AS pg_dist_transaction_after_recovery_coordinator_test + FROM pg_database, + dblink(format('dbname=%s host=localhost port=%s user=postgres', datname, + (SELECT setting::int FROM pg_settings WHERE name = 'port')), + $statement$ + SELECT groupid, gid + FROM pg_dist_transaction + WHERE gid LIKE 'citus_0_1234_4_0_%' + OR gid LIKE 'citus_0_should_be_forgotten_%' + $statement$) AS t(groupid integer, gid text) + WHERE datname LIKE 'db%') THEN + EXIT; + END IF; + PERFORM pg_sleep_for('1 SECOND'::interval); + END LOOP; + END +$$; -- Verify maintenance result SELECT count(*) = 0 AS too_many_clients_test FROM regexp_split_to_table(pg_read_file('../log/postmaster.log'), E'\n') AS t(log_line) @@ -271,22 +290,6 @@ WHERE log_line LIKE '%sorry, too many clients already%'; t (1 row) -SELECT count(*) = 0 AS pg_dist_transaction_after_recovery_coordinator_test -FROM pg_database, - dblink(format('dbname=%s host=localhost port=%s user=postgres', datname, - (SELECT setting::int FROM pg_settings WHERE name = 'port')), - $statement$ - SELECT groupid, gid - FROM pg_dist_transaction - WHERE gid LIKE 'citus_0_1234_4_0_%' - OR gid LIKE 'citus_0_should_be_forgotten_%' - $statement$) AS t(groupid integer, gid text) -WHERE datname LIKE 'db%'; - pg_dist_transaction_after_recovery_coordinator_test ---------------------------------------------------------------------- - t -(1 row) - SELECT count(*) = 0 AS cached_connections_after_recovery_coordinator_test FROM pg_stat_activity WHERE state = 'idle' diff --git a/src/test/regress/sql/multi_maintenance_multiple_databases.sql b/src/test/regress/sql/multi_maintenance_multiple_databases.sql index 11b56a999..d67f58296 100644 --- a/src/test/regress/sql/multi_maintenance_multiple_databases.sql +++ b/src/test/regress/sql/multi_maintenance_multiple_databases.sql @@ -222,7 +222,31 @@ WHERE state = 'idle' -- Let maintenance do it's work... -SELECT pg_sleep_for('10 seconds'::interval); +DO +$$ + BEGIN + FOR i IN 0 .. 300 + LOOP + IF i = 300 THEN RAISE 'Waited too long'; END IF; + PERFORM pg_stat_clear_snapshot(); + PERFORM * FROM pg_stat_activity WHERE application_name = 'Citus Maintenance Daemon'; + IF (SELECT count(*) = 0 AS pg_dist_transaction_after_recovery_coordinator_test + FROM pg_database, + dblink(format('dbname=%s host=localhost port=%s user=postgres', datname, + (SELECT setting::int FROM pg_settings WHERE name = 'port')), + $statement$ + SELECT groupid, gid + FROM pg_dist_transaction + WHERE gid LIKE 'citus_0_1234_4_0_%' + OR gid LIKE 'citus_0_should_be_forgotten_%' + $statement$) AS t(groupid integer, gid text) + WHERE datname LIKE 'db%') THEN + EXIT; + END IF; + PERFORM pg_sleep_for('1 SECOND'::interval); + END LOOP; + END +$$; -- Verify maintenance result @@ -230,18 +254,6 @@ SELECT count(*) = 0 AS too_many_clients_test FROM regexp_split_to_table(pg_read_file('../log/postmaster.log'), E'\n') AS t(log_line) WHERE log_line LIKE '%sorry, too many clients already%'; -SELECT count(*) = 0 AS pg_dist_transaction_after_recovery_coordinator_test -FROM pg_database, - dblink(format('dbname=%s host=localhost port=%s user=postgres', datname, - (SELECT setting::int FROM pg_settings WHERE name = 'port')), - $statement$ - SELECT groupid, gid - FROM pg_dist_transaction - WHERE gid LIKE 'citus_0_1234_4_0_%' - OR gid LIKE 'citus_0_should_be_forgotten_%' - $statement$) AS t(groupid integer, gid text) -WHERE datname LIKE 'db%'; - SELECT count(*) = 0 AS cached_connections_after_recovery_coordinator_test FROM pg_stat_activity WHERE state = 'idle'