postgres.git / summary / log / commit / refs

commit    353aa01687b5dd582debdfe63871498cd522cbbd
Author:   Fujii Masao <fujii@postgresql.org>
Date:     Fri Jan 07 06:31:56 2022 +0000
First released in: 15.0

    postgres_fdw: Add regression test for postgres_fdw.application_name GUC.
    
    Commit 449ab63505 added postgres_fdw.application_name GUC that specifies
    a value for application_name configuration parameter used when postgres_fdw
    establishes a connection to a foreign server. Also commit 6e0cb3dec1
    allowed it to include escape sequences. Both commits added the regression
    tests for the GUC, but those tests were reverted by commits 98dbef90eb and
    5e64ad3697 because they were unstable and caused some buildfarm members
    to report the failure.
    
    This is the third try to add the regression test for
    postgres_fdw.application_name GUC.
    
    One of issues to make the test unstable was to have used
    postgres_fdw_disconnect_all() to close the existing remote connections.
    The test expected that the remote connection and its corresponding backend
    at the remote server disappeared just after postgres_fdw_disconnect_all()
    was executed, but it could take a bit time for them to disappear.
    To make sure that they exit, this commit makes the test use
    pg_terminate_backend() with the timeout at the remote server, instead.
    If the timeout is set to greater than zero, this function waits until
    they are actually terminated (or until the given time has passed).
    
    Another issue was that the test didn't take into consideration the case
    where postgres_fdw.application_name containing some escape sequences was
    converted to the string larger than NAMEDATALEN. In this case it was
    truncated to less than NAMEDATALEN when it's passed to the remote server,
    but the test expected wrongly that full string of application_name was
    always viewable. This commit changes the test so that it can handle that case.
    
    Author: Fujii Masao
    Reviewed-by: Masahiko Sawada, Hayato Kuroda, Kyotaro Horiguchi
    Discussion: https://postgr.es/m/3220909.1631054766@sss.pgh.pa.us
    Discussion: https://postgr.es/m/20211224.180006.2247635208768233073.horikyota.ntt@gmail.com
    Discussion: https://postgr.es/m/e7b61420-a97b-8246-77c4-a0d48fba5a45@oss.nttdata.com


contrib/postgres_fdw/expected/postgres_fdw.out | 51 ++++++++++++++++++++++++++ contrib/postgres_fdw/sql/postgres_fdw.sql | 35 ++++++++++++++++++ 2 files changed, 86 insertions(+) diff --git a/contrib/postgres_fdw/expected/postgres_fdw.out b/contrib/postgres_fdw/expected/postgres_fdw.out index 7720ab9c581..7d6f7d9e3df 100644 --- a/contrib/postgres_fdw/expected/postgres_fdw.out +++ b/contrib/postgres_fdw/expected/postgres_fdw.out @@ -10825,3 +10825,54 @@ ERROR: invalid value for integer option "batch_size": 100$%$#$# ALTER FOREIGN DATA WRAPPER postgres_fdw OPTIONS (nonexistent 'fdw'); ERROR: invalid option "nonexistent" HINT: There are no valid options in this context. +-- =================================================================== +-- test postgres_fdw.application_name GUC +-- =================================================================== +--- Turn debug_discard_caches off for this test to make sure that +--- the remote connection is alive when checking its application_name. +SET debug_discard_caches = 0; +-- Specify escape sequences in application_name option of a server +-- object so as to test that they are replaced with status information +-- expectedly. +-- +-- Since pg_stat_activity.application_name may be truncated to less than +-- NAMEDATALEN characters, note that substring() needs to be used +-- at the condition of test query to make sure that the string consisting +-- of database name and process ID is also less than that. +ALTER SERVER loopback2 OPTIONS (application_name 'fdw_%d%p'); +SELECT 1 FROM ft6 LIMIT 1; + ?column? +---------- + 1 +(1 row) + +SELECT pg_terminate_backend(pid, 180000) FROM pg_stat_activity + WHERE application_name = + substring('fdw_' || current_database() || pg_backend_pid() for + current_setting('max_identifier_length')::int); + pg_terminate_backend +---------------------- + t +(1 row) + +-- postgres_fdw.application_name overrides application_name option +-- of a server object if both settings are present. +SET postgres_fdw.application_name TO 'fdw_%a%u%%'; +SELECT 1 FROM ft6 LIMIT 1; + ?column? +---------- + 1 +(1 row) + +SELECT pg_terminate_backend(pid, 180000) FROM pg_stat_activity + WHERE application_name = + substring('fdw_' || current_setting('application_name') || + CURRENT_USER || '%' for current_setting('max_identifier_length')::int); + pg_terminate_backend +---------------------- + t +(1 row) + +--Clean up +RESET postgres_fdw.application_name; +RESET debug_discard_caches; diff --git a/contrib/postgres_fdw/sql/postgres_fdw.sql b/contrib/postgres_fdw/sql/postgres_fdw.sql index beeac8af1ed..9eb673e3693 100644 --- a/contrib/postgres_fdw/sql/postgres_fdw.sql +++ b/contrib/postgres_fdw/sql/postgres_fdw.sql @@ -3452,3 +3452,38 @@ CREATE FOREIGN TABLE inv_bsz (c1 int ) -- No option is allowed to be specified at foreign data wrapper level ALTER FOREIGN DATA WRAPPER postgres_fdw OPTIONS (nonexistent 'fdw'); + +-- =================================================================== +-- test postgres_fdw.application_name GUC +-- =================================================================== +--- Turn debug_discard_caches off for this test to make sure that +--- the remote connection is alive when checking its application_name. +SET debug_discard_caches = 0; + +-- Specify escape sequences in application_name option of a server +-- object so as to test that they are replaced with status information +-- expectedly. +-- +-- Since pg_stat_activity.application_name may be truncated to less than +-- NAMEDATALEN characters, note that substring() needs to be used +-- at the condition of test query to make sure that the string consisting +-- of database name and process ID is also less than that. +ALTER SERVER loopback2 OPTIONS (application_name 'fdw_%d%p'); +SELECT 1 FROM ft6 LIMIT 1; +SELECT pg_terminate_backend(pid, 180000) FROM pg_stat_activity + WHERE application_name = + substring('fdw_' || current_database() || pg_backend_pid() for + current_setting('max_identifier_length')::int); + +-- postgres_fdw.application_name overrides application_name option +-- of a server object if both settings are present. +SET postgres_fdw.application_name TO 'fdw_%a%u%%'; +SELECT 1 FROM ft6 LIMIT 1; +SELECT pg_terminate_backend(pid, 180000) FROM pg_stat_activity + WHERE application_name = + substring('fdw_' || current_setting('application_name') || + CURRENT_USER || '%' for current_setting('max_identifier_length')::int); + +--Clean up +RESET postgres_fdw.application_name; +RESET debug_discard_caches; [parent: 50e144193c77]