From 9098992f820e4d5271f09dc18bc879412d50f7c9 Mon Sep 17 00:00:00 2001 From: Rene Cannao Date: Sun, 5 Apr 2026 05:49:07 +0000 Subject: [PATCH] Fix timing issue in PgSQL prepared statement purge test The purge verification in test 1 was checking the statement count immediately after creating statements. The purge mechanism has a 1-second minimum interval between attempts and only removes statements with ref_count_client == 0. Fix by closing the connection (dropping refcounts), waiting 3 seconds, then triggering a new refcount change to invoke the purge before checking. --- ...t_5352_prepared_statement_refcount_race-t.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/test/tap/tests/pgsql-reg_test_5352_prepared_statement_refcount_race-t.cpp b/test/tap/tests/pgsql-reg_test_5352_prepared_statement_refcount_race-t.cpp index fb960174e..7f28743a4 100644 --- a/test/tap/tests/pgsql-reg_test_5352_prepared_statement_refcount_race-t.cpp +++ b/test/tap/tests/pgsql-reg_test_5352_prepared_statement_refcount_race-t.cpp @@ -368,6 +368,22 @@ bool test_concurrent_prepared_statements() { } } + // The purge mechanism has a 1-second minimum interval between attempts + // (see PgSQL_PreparedStatement.cpp: ref_count_client___purge_stmts_if_needed). + // Close the verification connection to drop ref_count_client to 0 for all + // statements we just created, making them eligible for purge. + backend_conn.reset(); + + // Wait for the purge interval to elapse + std::this_thread::sleep_for(std::chrono::seconds(3)); + + // Open a new connection and trigger a refcount change so the purge fires + backend_conn = createNewConnection(BACKEND); + if (backend_conn) { + execute_prepared_stmt(backend_conn, "purge_trigger", "SELECT 'trigger_purge'", {}); + close_prepared_stmt(backend_conn, "purge_trigger"); + } + // Check how many statements remain after forcing a purge int stmt_count_after = 0; res = PQexec(admin_conn.get(), "SELECT COUNT(*) FROM stats_pgsql_prepared_statements_info");