Skip to content

Commit

Permalink
backport: Extend background_psql() to be able to start asynchronously
Browse files Browse the repository at this point in the history
This is a backport of ba08edb. Originally it was only applied to master,
but I (Andres) am planning to fix a few bugs in BackgroundPsql, which would be
somewhat harder with the behavioural differences across branches. It's also
generally good for test infrastructure to behave similarly across branches, to
avoid pain during backpatching.

Discussion: https://postgr.es/m/ilcctzb5ju2gulvnadjmhgatnkxsdpac652byb2u3d3wqziyvx@fbuqcglker46

Michael's original commit message:

This commit extends the constructor routine of BackgroundPsql.pm with a
new "wait" parameter.  If set to 0, the routine returns without waiting
for psql to start, ready to consume input.

background_psql() in Cluster.pm gains the same "wait" parameter.  The
default behavior is still to wait for psql to start.  It becomes now
possible to not wait, giving to TAP scripts the possibility to perform
actions between a BackgroundPsql startup and its wait_connect() call.

Author: Jacob Champion
Discussion: https://postgr.es/m/CAOYmi+=60deN20WDyCoHCiecgivJxr=98s7s7-C8SkXwrCfHXg@mail.gmail.com
  • Loading branch information
anarazel committed Feb 19, 2025
1 parent 31a242e commit 49b6f4a
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 8 deletions.
28 changes: 21 additions & 7 deletions src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
Original file line number Diff line number Diff line change
Expand Up @@ -68,20 +68,23 @@ use Test::More;
=over
=item PostgreSQL::Test::BackgroundPsql->new(interactive, @psql_params, timeout)
=item PostgreSQL::Test::BackgroundPsql->new(interactive, @psql_params, timeout, wait)
Builds a new object of class C<PostgreSQL::Test::BackgroundPsql> for either
an interactive or background session and starts it. If C<interactive> is
true then a PTY will be attached. C<psql_params> should contain the full
command to run psql with all desired parameters and a complete connection
string. For C<interactive> sessions, IO::Pty is required.
This routine will not return until psql has started up and is ready to
consume input. Set B<wait> to 0 to return immediately instead.
=cut

sub new
{
my $class = shift;
my ($interactive, $psql_params, $timeout) = @_;
my ($interactive, $psql_params, $timeout, $wait) = @_;
my $psql = {
'stdin' => '',
'stdout' => '',
Expand Down Expand Up @@ -119,14 +122,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) = @_;

Expand Down Expand Up @@ -187,7 +201,7 @@ sub reconnect_and_clear
$self->{stdin} = '';
$self->{stdout} = '';

$self->_wait_connect();
$self->wait_connect();
}

=pod
Expand Down
10 changes: 9 additions & 1 deletion src/test/perl/PostgreSQL/Test/Cluster.pm
Original file line number Diff line number Diff line change
Expand Up @@ -2191,6 +2191,12 @@ connection.
If given, it must be an array reference containing additional parameters to B<psql>.
=item wait => 1
By default, this method will not return until connection has completed (or
failed). Set B<wait> to 0 to return immediately instead. (Clients can call the
session's C<wait_connect> method manually when needed.)
=back
=cut
Expand All @@ -2214,13 +2220,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
Expand Down

0 comments on commit 49b6f4a

Please sign in to comment.