From 592ef05d30505c4c7a1a84084f80c807fce57476 Mon Sep 17 00:00:00 2001 From: Jacob Champion Date: Mon, 8 Jul 2024 10:46:55 -0700 Subject: [PATCH v2 2/4] Test::Cluster: let background_psql() work asynchronously Specifying `wait => 0` as a parameter to background_psql() causes it to return immediately, which lets the client run code during connection. (This is useful if, for example, connections are blocked on injected waitpoints.) Clients later call ->wait_connect() manually to complete the asynchronous connection. --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 23 ++++++++++++++----- src/test/perl/PostgreSQL/Test/Cluster.pm | 10 +++++++- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index 2760e4bc8d..13489ee95e 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -81,7 +81,7 @@ string. For C sessions, IO::Pty is required. sub new { my $class = shift; - my ($interactive, $psql_params, $timeout) = @_; + my ($interactive, $psql_params, $timeout, $wait) = @_; my $psql = { 'stdin' => '', 'stdout' => '', @@ -119,14 +119,25 @@ sub new my $self = bless $psql, $class; - $self->_wait_connect(); + $wait = 1 unless defined($wait); + if ($wait) + { + $self->wait_connect(); + } return $self; } -# Internal routine for awaiting psql starting up and being ready to consume -# input. -sub _wait_connect +=pod + +=item $session->wait_connect + +Returns once psql has started up and is ready to consume input. This is called +automatically for clients unless requested otherwise in the constructor. + +=cut + +sub wait_connect { my ($self) = @_; @@ -187,7 +198,7 @@ sub reconnect_and_clear $self->{stdin} = ''; $self->{stdout} = ''; - $self->_wait_connect(); + $self->wait_connect(); } =pod diff --git a/src/test/perl/PostgreSQL/Test/Cluster.pm b/src/test/perl/PostgreSQL/Test/Cluster.pm index 0135c5a795..759c9d93c2 100644 --- a/src/test/perl/PostgreSQL/Test/Cluster.pm +++ b/src/test/perl/PostgreSQL/Test/Cluster.pm @@ -2182,6 +2182,12 @@ connection. If given, it must be an array reference containing additional parameters to B. +=item wait => 1 + +By default, this method will not return until connection has completed (or +failed). Set B to 0 to return immediately instead. (Clients can call the +session's C method manually when needed.) + =back =cut @@ -2205,13 +2211,15 @@ sub background_psql '-'); $params{on_error_stop} = 1 unless defined $params{on_error_stop}; + $params{wait} = 1 unless defined $params{wait}; $timeout = $params{timeout} if defined $params{timeout}; push @psql_params, '-v', 'ON_ERROR_STOP=1' if $params{on_error_stop}; push @psql_params, @{ $params{extra_params} } if defined $params{extra_params}; - return PostgreSQL::Test::BackgroundPsql->new(0, \@psql_params, $timeout); + return PostgreSQL::Test::BackgroundPsql->new(0, \@psql_params, $timeout, + $params{wait}); } =pod -- 2.34.1