1
0
mirror of https://github.com/postgres/postgres.git synced 2025-11-24 00:23:06 +03:00

Add test for dead-end backends

The code path for launching a dead-end backend because we're out of
slots was not covered by any tests, so add one. (Some tests did hit
the case of launching a dead-end backend because the server is still
starting up, though, so the gap in our test coverage wasn't as big as
it sounds.)

Reviewed-by: Andres Freund <andres@anarazel.de>
Discussion: https://www.postgresql.org/message-id/a102f15f-eac4-4ff2-af02-f9ff209ec66f@iki.fi
This commit is contained in:
Heikki Linnakangas
2024-10-08 15:06:31 +03:00
parent 6a1d0d470e
commit 85ec945b78
2 changed files with 119 additions and 1 deletions

View File

@@ -104,6 +104,7 @@ use File::Path qw(rmtree mkpath);
use File::Spec;
use File::stat qw(stat);
use File::Temp ();
use IO::Socket::INET;
use IPC::Run;
use PostgreSQL::Version;
use PostgreSQL::Test::RecursiveCopy;
@@ -291,6 +292,83 @@ sub connstr
=pod
=item $node->raw_connect()
Open a raw TCP or Unix domain socket connection to the server. This is
used by low-level protocol and connection limit tests.
=cut
sub raw_connect
{
my ($self) = @_;
my $pgport = $self->port;
my $pghost = $self->host;
my $socket;
if ($PostgreSQL::Test::Utils::use_unix_sockets)
{
require IO::Socket::UNIX;
my $path = "$pghost/.s.PGSQL.$pgport";
$socket = IO::Socket::UNIX->new(
Type => SOCK_STREAM(),
Peer => $path,
) or die "Cannot create socket - $IO::Socket::errstr\n";
}
else
{
$socket = IO::Socket::INET->new(
PeerHost => $pghost,
PeerPort => $pgport,
Proto => 'tcp'
) or die "Cannot create socket - $IO::Socket::errstr\n";
}
return $socket;
}
=pod
=item $node->raw_connect_works()
Check if raw_connect() function works on this platform. This should
be called to SKIP any tests that require raw_connect().
This tries to connect to the server, to test whether it works or not,,
so the server is up and running. Otherwise this can return 0 even if
there's nothing wrong with raw_connect() itself.
Notably, raw_connect() does not work on Unix domain sockets on
Strawberry perl 5.26.3.1 on Windows, which we use in Cirrus CI images
as of this writing. It dies with "not implemented on this
architecture".
=cut
sub raw_connect_works
{
my ($self) = @_;
# If we're using Unix domain sockets, we need a working
# IO::Socket::UNIX implementation.
if ($PostgreSQL::Test::Utils::use_unix_sockets)
{
diag "checking if IO::Socket::UNIX works";
eval {
my $sock = $self->raw_connect();
$sock->close();
};
if ($@ =~ /not implemented/)
{
diag "IO::Socket::UNIX does not work: $@";
return 0;
}
}
return 1
}
=pod
=item $node->group_access()
Does the data dir allow group access?