From 4bf57cb1130858f88339ea07de98f59e2b80e3f4 Mon Sep 17 00:00:00 2001 From: Bharath Rupireddy Date: Thu, 8 Apr 2021 16:52:11 +0530 Subject: [PATCH v1] Simplify backend terminate and wait logic in postgres_fdw test With the recent commit aaf0432572 which introduced a waiting capability for pg_teriminate_backend function, we can simply backend terminate and wait logic in postgres_fdw.sql tests. --- .../postgres_fdw/expected/postgres_fdw.out | 35 +++++++++---------- contrib/postgres_fdw/sql/postgres_fdw.sql | 28 ++++----------- 2 files changed, 24 insertions(+), 39 deletions(-) diff --git a/contrib/postgres_fdw/expected/postgres_fdw.out b/contrib/postgres_fdw/expected/postgres_fdw.out index eeb6ae79d0..3067aa1230 100644 --- a/contrib/postgres_fdw/expected/postgres_fdw.out +++ b/contrib/postgres_fdw/expected/postgres_fdw.out @@ -8996,19 +8996,6 @@ WARNING: there is no transaction in progress -- =================================================================== -- reestablish new connection -- =================================================================== --- Terminate the backend having the specified application_name and wait for --- the termination to complete. -CREATE OR REPLACE PROCEDURE terminate_backend_and_wait(appname text) AS $$ -BEGIN - PERFORM pg_terminate_backend(pid) FROM pg_stat_activity - WHERE application_name = appname; - LOOP - PERFORM * FROM pg_stat_activity WHERE application_name = appname; - EXIT WHEN NOT FOUND; - PERFORM pg_sleep(1), pg_stat_clear_snapshot(); - END LOOP; -END; -$$ LANGUAGE plpgsql; -- Change application_name of remote connection to special one -- so that we can easily terminate the connection later. ALTER SERVER loopback OPTIONS (application_name 'fdw_retry_check'); @@ -9018,8 +9005,16 @@ SELECT 1 FROM ft1 LIMIT 1; 1 (1 row) --- Terminate the remote connection. -CALL terminate_backend_and_wait('fdw_retry_check'); +-- Terminate the remote backend having the specified application_name and wait +-- for the termination to complete. 10 seconds timeout here is chosen randomly, +-- we will see a warning if the process doesn't go away within that time. +SELECT pg_terminate_backend(pid, 10000) FROM pg_stat_activity + WHERE application_name = 'fdw_retry_check'; + pg_terminate_backend +---------------------- + t +(1 row) + -- This query should detect the broken connection when starting new remote -- transaction, reestablish new connection, and then succeed. BEGIN; @@ -9032,15 +9027,19 @@ SELECT 1 FROM ft1 LIMIT 1; -- If the query detects the broken connection when starting new remote -- subtransaction, it doesn't reestablish new connection and should fail. -- The text of the error might vary across platforms, so don't show it. -CALL terminate_backend_and_wait('fdw_retry_check'); +SELECT pg_terminate_backend(pid, 10000) FROM pg_stat_activity + WHERE application_name = 'fdw_retry_check'; + pg_terminate_backend +---------------------- + t +(1 row) + SAVEPOINT s; \set VERBOSITY sqlstate SELECT 1 FROM ft1 LIMIT 1; -- should fail ERROR: 08006 \set VERBOSITY default COMMIT; --- Clean up -DROP PROCEDURE terminate_backend_and_wait(text); -- ============================================================================= -- test connection invalidation cases and postgres_fdw_get_connections function -- ============================================================================= diff --git a/contrib/postgres_fdw/sql/postgres_fdw.sql b/contrib/postgres_fdw/sql/postgres_fdw.sql index 3b4f90a99c..5da64744be 100644 --- a/contrib/postgres_fdw/sql/postgres_fdw.sql +++ b/contrib/postgres_fdw/sql/postgres_fdw.sql @@ -2684,28 +2684,16 @@ ROLLBACK; -- =================================================================== -- reestablish new connection -- =================================================================== - --- Terminate the backend having the specified application_name and wait for --- the termination to complete. -CREATE OR REPLACE PROCEDURE terminate_backend_and_wait(appname text) AS $$ -BEGIN - PERFORM pg_terminate_backend(pid) FROM pg_stat_activity - WHERE application_name = appname; - LOOP - PERFORM * FROM pg_stat_activity WHERE application_name = appname; - EXIT WHEN NOT FOUND; - PERFORM pg_sleep(1), pg_stat_clear_snapshot(); - END LOOP; -END; -$$ LANGUAGE plpgsql; - -- Change application_name of remote connection to special one -- so that we can easily terminate the connection later. ALTER SERVER loopback OPTIONS (application_name 'fdw_retry_check'); SELECT 1 FROM ft1 LIMIT 1; --- Terminate the remote connection. -CALL terminate_backend_and_wait('fdw_retry_check'); +-- Terminate the remote backend having the specified application_name and wait +-- for the termination to complete. 10 seconds timeout here is chosen randomly, +-- we will see a warning if the process doesn't go away within that time. +SELECT pg_terminate_backend(pid, 10000) FROM pg_stat_activity + WHERE application_name = 'fdw_retry_check'; -- This query should detect the broken connection when starting new remote -- transaction, reestablish new connection, and then succeed. @@ -2715,16 +2703,14 @@ SELECT 1 FROM ft1 LIMIT 1; -- If the query detects the broken connection when starting new remote -- subtransaction, it doesn't reestablish new connection and should fail. -- The text of the error might vary across platforms, so don't show it. -CALL terminate_backend_and_wait('fdw_retry_check'); +SELECT pg_terminate_backend(pid, 10000) FROM pg_stat_activity + WHERE application_name = 'fdw_retry_check'; SAVEPOINT s; \set VERBOSITY sqlstate SELECT 1 FROM ft1 LIMIT 1; -- should fail \set VERBOSITY default COMMIT; --- Clean up -DROP PROCEDURE terminate_backend_and_wait(text); - -- ============================================================================= -- test connection invalidation cases and postgres_fdw_get_connections function -- ============================================================================= -- 2.25.1