v2-0002-Report-test-failure-rather-than-aborting-in-case-.patch
application/octet-stream
Filename: v2-0002-Report-test-failure-rather-than-aborting-in-case-.patch
Type: application/octet-stream
Part: 1
Patch
Format: format-patch
Series: patch v2-0002
Subject: Report test failure rather than aborting in case of timeout
| File | + | − |
|---|---|---|
| src/test/modules/test_misc/t/005_timeouts.pl | 1 | 5 |
| src/test/perl/PostgreSQL/Test/BackgroundPsql.pm | 11 | 5 |
| src/test/recovery/t/031_recovery_conflict.pl | 1 | 3 |
From 7306c48710d3851d3344a8e1df11dc87ce9bd177 Mon Sep 17 00:00:00 2001
From: Daniel Gustafsson <dgustafsson@postgresql.org>
Date: Thu, 31 Oct 2024 13:23:10 +0100
Subject: [PATCH v2 2/2] Report test failure rather than aborting in case of
timeout
When an querying an interactive, or background, psql process the call
would die() in case of a timeout since it used the IPC::Run timeout
construct and not a timer. This aborts tests prematurely which makes
debugging harder, and stops getting results for the remaining tests
in the suite. This converts to using a timer object instead which
will transfer control back to the caller regardless, returning undef
in case of a timeout along with logging a test failure. Affected
callsites are also updated to reflect this.
Reviewed-by: Heikki Linnakangas <hlinnaka@iki.fi>
Discussion: https://postgr.es/m/1100715.1712265845@sss.pgh.pa.us
---
src/test/modules/test_misc/t/005_timeouts.pl | 6 +-----
src/test/perl/PostgreSQL/Test/BackgroundPsql.pm | 16 +++++++++++-----
src/test/recovery/t/031_recovery_conflict.pl | 4 +---
3 files changed, 13 insertions(+), 13 deletions(-)
diff --git a/src/test/modules/test_misc/t/005_timeouts.pl b/src/test/modules/test_misc/t/005_timeouts.pl
index d9b7219121..59a89b5029 100644
--- a/src/test/modules/test_misc/t/005_timeouts.pl
+++ b/src/test/modules/test_misc/t/005_timeouts.pl
@@ -118,11 +118,7 @@ $node->safe_psql('postgres',
# We just initialize the GUC and wait. No transaction is required.
$psql_session = $node->background_psql('postgres');
-$psql_session->query_until(
- qr/starting_bg_psql/, q(
- \echo starting_bg_psql
- SET idle_session_timeout to '10ms';
-));
+$psql_session->query(q(SET idle_session_timeout to '10ms';));
# Wait until the backend enters the timeout injection point.
$node->wait_for_event('client backend', 'idle-session-timeout');
diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index 3c2aca1c5d..a603c5d252 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -96,7 +96,7 @@ sub new
"Forbidden caller of constructor: package: $package, file: $file:$line"
unless $package->isa('PostgreSQL::Test::Cluster');
- $psql->{timeout} = IPC::Run::timeout(
+ $psql->{timeout} = IPC::Run::timer(
defined($timeout)
? $timeout
: $PostgreSQL::Test::Utils::timeout_default);
@@ -148,7 +148,9 @@ sub _wait_connect
=item $session->quit
Close the session and clean up resources. Each test run must be closed with
-C<quit>.
+C<quit>. Returns TRUE when the session was cleanly terminated, otherwise
+FALSE. A test failure will be issued in case the session exited with a non-
+zero exit status (the finish() method returns TRUE for 0 exit status).
=cut
@@ -158,7 +160,9 @@ sub quit
$self->{stdin} .= "\\q\n";
- return $self->{run}->finish;
+ my $ret = $self->{run}->finish;
+ ok($ret, 'Terminating interactive psql session');
+ return $ret;
}
=pod
@@ -219,7 +223,8 @@ sub query
pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/);
- die "psql query timed out" if $self->{timeout}->is_expired;
+ isnt($self->{timeout}->is_expired, 'psql query timed out');
+ return undef if $self->{timeout}->is_expired;
$output = $self->{stdout};
# remove banner again, our caller doesn't care
@@ -278,7 +283,8 @@ sub query_until
pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, $until);
- die "psql query timed out" if $self->{timeout}->is_expired;
+ isnt($self->{timeout}->is_expired, 'psql query_until timed out');
+ return undef if $self->{timeout}->is_expired;
$ret = $self->{stdout};
diff --git a/src/test/recovery/t/031_recovery_conflict.pl b/src/test/recovery/t/031_recovery_conflict.pl
index d87efa823f..62936f52d2 100644
--- a/src/test/recovery/t/031_recovery_conflict.pl
+++ b/src/test/recovery/t/031_recovery_conflict.pl
@@ -253,9 +253,7 @@ $res = $psql_standby->query_until(
-- wait for lock held by prepared transaction
SELECT * FROM $table2;
]);
-ok(1,
- "$sect: cursor holding conflicting pin, also waiting for lock, established"
-);
+isnt($res, undef, "$sect: cursor holding conflicting pin, also waiting for lock, established");
# just to make sure we're waiting for lock already
ok( $node_standby->poll_query_until(
--
2.39.3 (Apple Git-146)