1
0
mirror of https://github.com/postgres/postgres.git synced 2025-05-05 09:19:17 +03:00

Close psql processes gracefully in recovery tests

Under windows, psql processes need to be ended explicitly, or the TAP
tests hang. However, the recovery tests were doing this via
IPC::Run::kill_kill(), which causes other major problems on Windows.

We solve this by instead sending '\q' to psql so it quits of its own
accord, and then simply waiting for it. This means we can now run almost
all the recovery tests on all Windows platforms.

Discussion: https://postgr.es/m/20210301200715.tdjpuesfzebpffgn@alap3.anarazel.de
This commit is contained in:
Andrew Dunstan 2021-03-04 13:13:10 -05:00
parent 040af77938
commit d3676a2e9f
2 changed files with 9 additions and 13 deletions

View File

@ -7,16 +7,8 @@ use PostgresNode;
use TestLib; use TestLib;
use Test::More; use Test::More;
use Config; use Config;
if ($Config{osname} eq 'MSWin32')
{
# some Windows Perls at least don't like IPC::Run's start/kill_kill regime. plan tests => 3;
plan skip_all => "Test fails on Windows perl";
}
else
{
plan tests => 3;
}
my $node = get_new_node('primary'); my $node = get_new_node('primary');
$node->init(allows_streaming => 1); $node->init(allows_streaming => 1);
@ -65,4 +57,5 @@ cmp_ok($node->safe_psql('postgres', 'SELECT pg_current_xact_id()'),
is($node->safe_psql('postgres', qq[SELECT pg_xact_status('$xid');]), is($node->safe_psql('postgres', qq[SELECT pg_xact_status('$xid');]),
'aborted', 'xid is aborted after crash'); 'aborted', 'xid is aborted after crash');
$tx->kill_kill; $stdin .= "\\q\n";
$tx->finish; # wait for psql to quit gracefully

View File

@ -151,9 +151,12 @@ ok(send_query_and_wait(\%psql_standby,
qr/will_commit.*\n\(1 row\)$/m), qr/will_commit.*\n\(1 row\)$/m),
'finished prepared visible'); 'finished prepared visible');
# explicitly shut down psql instances - they cause hangs on windows # explicitly shut down psql instances gracefully - to avoid hangs
$psql_primary{run}->kill_kill; # or worse on windows
$psql_standby{run}->kill_kill; $psql_primary{stdin} .= "\\q\n";
$psql_primary{run}->finish;
$psql_standby{stdin} .= "\\q\n";
$psql_standby{run}->finish;
$node_primary->stop; $node_primary->stop;
$node_standby->stop; $node_standby->stop;