aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2022-04-05 20:44:01 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2022-04-05 20:44:01 -0400
commit9a7229948c70945ca6ef0b36adfe61b74f4fdaf5 (patch)
tree37bd3235b4bd5ae12e6ab5a73914b4babd934436
parent8803df4ea960117f42f38ee82a74e954e72e0339 (diff)
downloadpostgresql-9a7229948c70945ca6ef0b36adfe61b74f4fdaf5.tar.gz
postgresql-9a7229948c70945ca6ef0b36adfe61b74f4fdaf5.zip
Remove race condition in 022_crash_temp_files.pl test.
It's possible for the query that "waits for restart" to complete a successful iteration before the postmaster has noticed its SIGKILL'd child and begun the restart cycle. (This is a bit hard to believe perhaps, but it's been seen at least twice in the buildfarm, mainly on ancient platforms that likely have quirky schedulers.) To provide a more secure interlock, wait for the other session we're using to report that it's been forcibly shut down. Patch by me, based on a suggestion from Andres Freund. Back-patch to v14 where this test case came in. Discussion: https://postgr.es/m/1801850.1649047827@sss.pgh.pa.us
-rw-r--r--src/test/recovery/t/022_crash_temp_files.pl34
1 files changed, 29 insertions, 5 deletions
diff --git a/src/test/recovery/t/022_crash_temp_files.pl b/src/test/recovery/t/022_crash_temp_files.pl
index 74965348791..5ddc00fb05f 100644
--- a/src/test/recovery/t/022_crash_temp_files.pl
+++ b/src/test/recovery/t/022_crash_temp_files.pl
@@ -16,7 +16,7 @@ if ($Config{osname} eq 'MSWin32')
}
else
{
- plan tests => 9;
+ plan tests => 11;
}
@@ -130,11 +130,23 @@ $killme_stderr2 = '';
my $ret = TestLib::system_log('pg_ctl', 'kill', 'KILL', $pid);
is($ret, 0, 'killed process with KILL');
-# Close psql session
+# Close that psql session
$killme->finish;
+
+# Wait till the other session reports failure, ensuring that the postmaster
+# has noticed its dead child and begun a restart cycle.
+$killme_stdin2 .= qq[
+SELECT pg_sleep($TestLib::timeout_default);
+];
+ok( pump_until(
+ $killme2,
+ \$killme_stderr2,
+ qr/WARNING: terminating connection because of crash of another server process|server closed the connection unexpectedly|connection to server was lost|could not send data to server/m
+ ),
+ "second psql session died successfully after SIGKILL");
$killme2->finish;
-# Wait till server restarts
+# Wait till server finishes restarting
$node->poll_query_until('postgres', undef, '');
# Check for temporary files
@@ -219,11 +231,23 @@ $killme_stderr2 = '';
$ret = TestLib::system_log('pg_ctl', 'kill', 'KILL', $pid);
is($ret, 0, 'killed process with KILL');
-# Close psql session
+# Close that psql session
$killme->finish;
+
+# Wait till the other session reports failure, ensuring that the postmaster
+# has noticed its dead child and begun a restart cycle.
+$killme_stdin2 .= qq[
+SELECT pg_sleep($TestLib::timeout_default);
+];
+ok( pump_until(
+ $killme2,
+ \$killme_stderr2,
+ qr/WARNING: terminating connection because of crash of another server process|server closed the connection unexpectedly|connection to server was lost|could not send data to server/m
+ ),
+ "second psql session died successfully after SIGKILL");
$killme2->finish;
-# Wait till server restarts
+# Wait till server finishes restarting
$node->poll_query_until('postgres', undef, '');
# Check for temporary files -- should be there