summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Paquier2023-09-13 01:10:04 +0000
committerMichael Paquier2023-09-13 01:10:04 +0000
commit522a31ac873d7c6b02677f6d119c089a7dd09dd1 (patch)
tree30e23da38998a814cdb1e513f6236776d3f28cae
parentc53e288dba96bf42c5bfc21e75b45efbf37863d0 (diff)
Switch psql's TAP test for query cancellation to use IPC::Run::signal()
Previously, the test relied on a trick with a shell to retrieve the PID of the psql session to be stopped with SIGINT, that was skipped on Windows. This commit changes the test to use IPC::Run::signal() instead, which still does not work on Windows, but for a different reason: SIGINT would stop the test before finishing. This should allow the test to run on non-Windows platforms where PPID is not supported (like NetBSD), spreading it a bit more across the buildfarm. And the logic of the test is simpler. It is the first time in the tree that IPC::Run::signal() is used, so, as a matter of safety (or just call that as me having cold feet), no backpatch is done, at least for now. Author: Yugo NAGATA Reviewed-by: Fabien Coelho Discussion: https://postgr.es/m/[email protected]
-rw-r--r--src/bin/psql/t/020_cancel.pl38
1 files changed, 2 insertions, 36 deletions
diff --git a/src/bin/psql/t/020_cancel.pl b/src/bin/psql/t/020_cancel.pl
index bf438a36c1f..2590b014dda 100644
--- a/src/bin/psql/t/020_cancel.pl
+++ b/src/bin/psql/t/020_cancel.pl
@@ -10,18 +10,11 @@ use Test::More;
use Time::HiRes qw(usleep);
# Test query canceling by sending SIGINT to a running psql
-#
-# There is, as of this writing, no documented way to get the PID of
-# the process from IPC::Run. As a workaround, we have psql print its
-# own PID (which is the parent of the shell launched by psql) to a
-# file.
if ($windows_os)
{
- plan skip_all => "cancel test requires a Unix shell";
+ plan skip_all => 'sending SIGINT on Windows terminates the test itself';
}
-my $tempdir = PostgreSQL::Test::Utils::tempdir;
-
my $node = PostgreSQL::Test::Cluster->new('main');
$node->init;
$node->start;
@@ -29,36 +22,9 @@ $node->start;
local %ENV = $node->_get_env();
my ($stdin, $stdout, $stderr);
-
-# Test whether shell supports $PPID. It's part of POSIX, but some
-# pre-/non-POSIX shells don't support it (e.g., NetBSD).
-$stdin = "\\! echo \$PPID";
-IPC::Run::run([ 'psql', '-X', '-v', 'ON_ERROR_STOP=1' ],
- '<', \$stdin, '>', \$stdout, '2>', \$stderr);
-$stdout =~ /^\d+$/ or skip "shell apparently does not support \$PPID", 2;
-
-# Now start the real test
my $h = IPC::Run::start([ 'psql', '-X', '-v', 'ON_ERROR_STOP=1' ],
\$stdin, \$stdout, \$stderr);
-# Get the PID
-$stdout = '';
-$stderr = '';
-$stdin = "\\! echo \$PPID >$tempdir/psql.pid\n";
-pump $h while length $stdin;
-my $count;
-my $psql_pid;
-until (
- -s "$tempdir/psql.pid"
- and
- ($psql_pid = PostgreSQL::Test::Utils::slurp_file("$tempdir/psql.pid"))
- =~ /^\d+\n/s)
-{
- ($count++ < 100 * $PostgreSQL::Test::Utils::timeout_default)
- or die "pid file did not appear";
- usleep(10_000);
-}
-
# Send sleep command and wait until the server has registered it
$stdin = "select pg_sleep($PostgreSQL::Test::Utils::timeout_default);\n";
pump $h while length $stdin;
@@ -67,7 +33,7 @@ $node->poll_query_until('postgres',
) or die "timed out";
# Send cancel request
-kill 'INT', $psql_pid;
+$h->signal('INT');
my $result = finish $h;