Close psql processes gracefully in recovery tests
authorAndrew Dunstan <andrew@dunslane.net>
Thu, 4 Mar 2021 18:13:10 +0000 (13:13 -0500)
committerAndrew Dunstan <andrew@dunslane.net>
Thu, 4 Mar 2021 18:23:41 +0000 (13:23 -0500)
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

src/test/recovery/t/011_crash_recovery.pl
src/test/recovery/t/021_row_visibility.pl

index 5fe917978c6abf48584f4e1531a39e16bf59f5f8..10cd98f70aa28bfdec96b811084cb1215c313d3c 100644 (file)
@@ -7,16 +7,8 @@ use PostgresNode;
 use TestLib;
 use Test::More;
 use Config;
-if ($Config{osname} eq 'MSWin32')
-{
 
-   # some Windows Perls at least don't like IPC::Run's start/kill_kill regime.
-   plan skip_all => "Test fails on Windows perl";
-}
-else
-{
-   plan tests => 3;
-}
+plan tests => 3;
 
 my $node = get_new_node('primary');
 $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');]),
    'aborted', 'xid is aborted after crash');
 
-$tx->kill_kill;
+$stdin .= "\\q\n";
+$tx->finish; # wait for psql to quit gracefully
index b76990dfe05c8e87f93b31787ee1ec77a3d8e7e2..f6a486bb886728084b26552aa4b5da12017321e1 100644 (file)
@@ -151,9 +151,12 @@ ok(send_query_and_wait(\%psql_standby,
                       qr/will_commit.*\n\(1 row\)$/m),
    'finished prepared visible');
 
-# explicitly shut down psql instances - they cause hangs on windows
-$psql_primary{run}->kill_kill;
-$psql_standby{run}->kill_kill;
+# explicitly shut down psql instances gracefully - to avoid hangs
+# or worse on windows
+$psql_primary{stdin}  .= "\\q\n";
+$psql_primary{run}->finish;
+$psql_standby{stdin} .= "\\q\n";
+$psql_standby{run}->finish;
 
 $node_primary->stop;
 $node_standby->stop;