|
7 | 7 | use PostgresNode;
|
8 | 8 | use TestLib;
|
9 | 9 | use Test::More tests => 2;
|
| 10 | +use Time::HiRes qw(usleep); |
10 | 11 |
|
11 | 12 | my $tempdir = TestLib::tempdir;
|
12 | 13 |
|
|
28 | 29 | my ($stdin, $stdout, $stderr);
|
29 | 30 |
|
30 | 31 | # Test whether shell supports $PPID. It's part of POSIX, but some
|
31 |
| - # pre-/non-POSIX shells don't support it (e.g., NetBSD, Solaris). |
| 32 | + # pre-/non-POSIX shells don't support it (e.g., NetBSD). |
32 | 33 | $stdin = "\\! echo \$PPID";
|
33 | 34 | IPC::Run::run(['psql', '-X', '-v', 'ON_ERROR_STOP=1'], '<', \$stdin, '>', \$stdout, '2>', \$stderr);
|
34 | 35 | $stdout =~ /^\d+$/ or skip "shell apparently does not support \$PPID", 2;
|
35 | 36 |
|
36 |
| - local $SIG{ALRM} = sub { |
37 |
| - my $psql_pid = TestLib::slurp_file("$tempdir/psql.pid"); |
38 |
| - kill 'INT', $psql_pid; |
39 |
| - }; |
40 |
| - alarm 1; |
| 37 | + # Now start the real test |
| 38 | + my $h = IPC::Run::start(['psql', '-X', '-v', 'ON_ERROR_STOP=1'], \$stdin, \$stdout, \$stderr); |
41 | 39 |
|
42 |
| - $stdin = "\\! echo \$PPID >$tempdir/psql.pid\nselect pg_sleep(3);"; |
43 |
| - my $result = IPC::Run::run(['psql', '-X', '-v', 'ON_ERROR_STOP=1'], '<', \$stdin, '>', \$stdout, '2>', \$stderr); |
| 40 | + # Get the PID |
| 41 | + $stdout = ''; |
| 42 | + $stderr = ''; |
| 43 | + $stdin = "\\! echo \$PPID >$tempdir/psql.pid\n"; |
| 44 | + pump $h while length $stdin; |
| 45 | + my $count; |
| 46 | + my $psql_pid; |
| 47 | + until (-s "$tempdir/psql.pid" and ($psql_pid = TestLib::slurp_file("$tempdir/psql.pid")) =~ /^\d+\n/s) |
| 48 | + { |
| 49 | + ($count++ < 180 * 100) or die "pid file did not appear"; |
| 50 | + usleep(10_000) |
| 51 | + } |
| 52 | + |
| 53 | + # Send sleep command and wait until the server has registered it |
| 54 | + $stdin = "select pg_sleep(180);\n"; |
| 55 | + pump $h while length $stdin; |
| 56 | + $node->poll_query_until('postgres', q{SELECT (SELECT count(*) FROM pg_stat_activity WHERE query ~ 'pg_sleep') > 0;}) |
| 57 | + or die "timed out"; |
| 58 | + |
| 59 | + # Send cancel request |
| 60 | + kill 'INT', $psql_pid; |
| 61 | + |
| 62 | + my $result = finish $h; |
44 | 63 |
|
45 | 64 | ok(!$result, 'query failed as expected');
|
46 | 65 | like($stderr, qr/canceling statement due to user request/, 'query was canceled');
|
|
0 commit comments