mirror of
https://github.com/postgres/postgres.git
synced 2025-06-22 02:52:08 +03:00
Revert "Consistently test for in-use shared memory."
This reverts commits2f932f71d9
,16ee6eaf80
and6f0e190056
. The buildfarm has revealed several bugs. Back-patch like the original commits. Discussion: https://postgr.es/m/20190404145319.GA1720877@rfd.leadboat.com
This commit is contained in:
@ -104,8 +104,7 @@ our @EXPORT = qw(
|
||||
get_new_node
|
||||
);
|
||||
|
||||
our ($use_tcp, $test_localhost, $test_pghost, $last_host_assigned,
|
||||
$last_port_assigned, @all_nodes, $died);
|
||||
our ($test_localhost, $test_pghost, $last_port_assigned, @all_nodes, $died);
|
||||
|
||||
# Windows path to virtual file system root
|
||||
|
||||
@ -119,14 +118,13 @@ if ($Config{osname} eq 'msys')
|
||||
INIT
|
||||
{
|
||||
|
||||
# Set PGHOST for backward compatibility. This doesn't work for own_host
|
||||
# nodes, so prefer to not rely on this when writing new tests.
|
||||
$use_tcp = $TestLib::windows_os;
|
||||
$test_localhost = "127.0.0.1";
|
||||
$last_host_assigned = 1;
|
||||
$test_pghost = $use_tcp ? $test_localhost : TestLib::tempdir_short;
|
||||
$ENV{PGHOST} = $test_pghost;
|
||||
$ENV{PGDATABASE} = 'postgres';
|
||||
# PGHOST is set once and for all through a single series of tests when
|
||||
# this module is loaded.
|
||||
$test_localhost = "127.0.0.1";
|
||||
$test_pghost =
|
||||
$TestLib::windows_os ? $test_localhost : TestLib::tempdir_short;
|
||||
$ENV{PGHOST} = $test_pghost;
|
||||
$ENV{PGDATABASE} = 'postgres';
|
||||
|
||||
# Tracking of last port value assigned to accelerate free port lookup.
|
||||
$last_port_assigned = int(rand() * 16384) + 49152;
|
||||
@ -157,9 +155,7 @@ sub new
|
||||
_host => $pghost,
|
||||
_basedir => "$TestLib::tmp_check/t_${testname}_${name}_data",
|
||||
_name => $name,
|
||||
_logfile_generation => 0,
|
||||
_logfile_base => "$TestLib::log_path/${testname}_${name}",
|
||||
_logfile => "$TestLib::log_path/${testname}_${name}.log"
|
||||
_logfile => "$TestLib::log_path/${testname}_${name}.log"
|
||||
};
|
||||
|
||||
bless $self, $class;
|
||||
@ -477,9 +473,8 @@ sub init
|
||||
print $conf "max_wal_senders = 0\n";
|
||||
}
|
||||
|
||||
if ($use_tcp)
|
||||
if ($TestLib::windows_os)
|
||||
{
|
||||
print $conf "unix_socket_directories = ''\n";
|
||||
print $conf "listen_addresses = '$host'\n";
|
||||
}
|
||||
else
|
||||
@ -541,11 +536,12 @@ sub backup
|
||||
{
|
||||
my ($self, $backup_name) = @_;
|
||||
my $backup_path = $self->backup_dir . '/' . $backup_name;
|
||||
my $port = $self->port;
|
||||
my $name = $self->name;
|
||||
|
||||
print "# Taking pg_basebackup $backup_name from node \"$name\"\n";
|
||||
TestLib::system_or_bail('pg_basebackup', '-D', $backup_path, '-h',
|
||||
$self->host, '-p', $self->port, '--no-sync');
|
||||
TestLib::system_or_bail('pg_basebackup', '-D', $backup_path, '-p', $port,
|
||||
'--no-sync');
|
||||
print "# Backup finished\n";
|
||||
return;
|
||||
}
|
||||
@ -657,7 +653,6 @@ sub init_from_backup
|
||||
{
|
||||
my ($self, $root_node, $backup_name, %params) = @_;
|
||||
my $backup_path = $root_node->backup_dir . '/' . $backup_name;
|
||||
my $host = $self->host;
|
||||
my $port = $self->port;
|
||||
my $node_name = $self->name;
|
||||
my $root_name = $root_node->name;
|
||||
@ -684,15 +679,6 @@ sub init_from_backup
|
||||
qq(
|
||||
port = $port
|
||||
));
|
||||
if ($use_tcp)
|
||||
{
|
||||
$self->append_conf('postgresql.conf', "listen_addresses = '$host'");
|
||||
}
|
||||
else
|
||||
{
|
||||
$self->append_conf('postgresql.conf',
|
||||
"unix_socket_directories = '$host'");
|
||||
}
|
||||
$self->enable_streaming($root_node) if $params{has_streaming};
|
||||
$self->enable_restoring($root_node) if $params{has_restoring};
|
||||
return;
|
||||
@ -700,45 +686,17 @@ port = $port
|
||||
|
||||
=pod
|
||||
|
||||
=item $node->rotate_logfile()
|
||||
|
||||
Switch to a new PostgreSQL log file. This does not alter any running
|
||||
PostgreSQL process. Subsequent method calls, including pg_ctl invocations,
|
||||
will use the new name. Return the new name.
|
||||
|
||||
=cut
|
||||
|
||||
sub rotate_logfile
|
||||
{
|
||||
my ($self) = @_;
|
||||
$self->{_logfile} = sprintf('%s_%d.log',
|
||||
$self->{_logfile_base},
|
||||
++$self->{_logfile_generation});
|
||||
return $self->{_logfile};
|
||||
}
|
||||
|
||||
=pod
|
||||
|
||||
=item $node->start(%params) => success_or_failure
|
||||
=item $node->start()
|
||||
|
||||
Wrapper for pg_ctl start
|
||||
|
||||
Start the node and wait until it is ready to accept connections.
|
||||
|
||||
=over
|
||||
|
||||
=item fail_ok => 1
|
||||
|
||||
By default, failure terminates the entire F<prove> invocation. If given,
|
||||
instead return a true or false value to indicate success or failure.
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
|
||||
sub start
|
||||
{
|
||||
my ($self, %params) = @_;
|
||||
my ($self) = @_;
|
||||
my $port = $self->port;
|
||||
my $pgdata = $self->data_dir;
|
||||
my $name = $self->name;
|
||||
@ -751,34 +709,10 @@ sub start
|
||||
{
|
||||
print "# pg_ctl start failed; logfile:\n";
|
||||
print TestLib::slurp_file($self->logfile);
|
||||
BAIL_OUT("pg_ctl start failed") unless $params{fail_ok};
|
||||
return 0;
|
||||
BAIL_OUT("pg_ctl start failed");
|
||||
}
|
||||
|
||||
$self->_update_pid(1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
=pod
|
||||
|
||||
=item $node->kill9()
|
||||
|
||||
Send SIGKILL (signal 9) to the postmaster.
|
||||
|
||||
Note: if the node is already known stopped, this does nothing.
|
||||
However, if we think it's running and it's not, it's important for
|
||||
this to fail. Otherwise, tests might fail to detect server crashes.
|
||||
|
||||
=cut
|
||||
|
||||
sub kill9
|
||||
{
|
||||
my ($self) = @_;
|
||||
my $name = $self->name;
|
||||
return unless defined $self->{_pid};
|
||||
print "### Killing node \"$name\" using signal 9\n";
|
||||
kill(9, $self->{_pid}) or BAIL_OUT("kill(9, $self->{_pid}) failed");
|
||||
$self->{_pid} = undef;
|
||||
return;
|
||||
}
|
||||
|
||||
@ -974,7 +908,7 @@ sub _update_pid
|
||||
|
||||
=pod
|
||||
|
||||
=item PostgresNode->get_new_node(node_name, %params)
|
||||
=item PostgresNode->get_new_node(node_name)
|
||||
|
||||
Build a new object of class C<PostgresNode> (or of a subclass, if you have
|
||||
one), assigning a free port number. Remembers the node, to prevent its port
|
||||
@ -983,22 +917,6 @@ shut down when the test script exits.
|
||||
|
||||
You should generally use this instead of C<PostgresNode::new(...)>.
|
||||
|
||||
=over
|
||||
|
||||
=item port => [1,65535]
|
||||
|
||||
By default, this function assigns a port number to each node. Specify this to
|
||||
force a particular port number. The caller is responsible for evaluating
|
||||
potential conflicts and privilege requirements.
|
||||
|
||||
=item own_host => 1
|
||||
|
||||
By default, all nodes use the same PGHOST value. If specified, generate a
|
||||
PGHOST specific to this node. This allows multiple nodes to use the same
|
||||
port.
|
||||
|
||||
=back
|
||||
|
||||
For backwards compatibility, it is also exported as a standalone function,
|
||||
which can only create objects of class C<PostgresNode>.
|
||||
|
||||
@ -1007,11 +925,10 @@ which can only create objects of class C<PostgresNode>.
|
||||
sub get_new_node
|
||||
{
|
||||
my $class = 'PostgresNode';
|
||||
$class = shift if scalar(@_) % 2 != 1;
|
||||
my ($name, %params) = @_;
|
||||
my $port_is_forced = defined $params{port};
|
||||
my $found = $port_is_forced;
|
||||
my $port = $port_is_forced ? $params{port} : $last_port_assigned;
|
||||
$class = shift if 1 < scalar @_;
|
||||
my $name = shift;
|
||||
my $found = 0;
|
||||
my $port = $last_port_assigned;
|
||||
|
||||
while ($found == 0)
|
||||
{
|
||||
@ -1028,15 +945,13 @@ sub get_new_node
|
||||
$found = 0 if ($node->port == $port);
|
||||
}
|
||||
|
||||
# Check to see if anything else is listening on this TCP port. Accept
|
||||
# only ports available for all possible listen_addresses values, so
|
||||
# the caller can harness this port for the widest range of purposes.
|
||||
# This is *necessary* on Windows, and seems like a good idea on Unixen
|
||||
# as well, even though we don't ask the postmaster to open a TCP port
|
||||
# on Unix.
|
||||
# Check to see if anything else is listening on this TCP port.
|
||||
# This is *necessary* on Windows, and seems like a good idea
|
||||
# on Unixen as well, even though we don't ask the postmaster
|
||||
# to open a TCP port on Unix.
|
||||
if ($found == 1)
|
||||
{
|
||||
my $iaddr = inet_aton('0.0.0.0');
|
||||
my $iaddr = inet_aton($test_localhost);
|
||||
my $paddr = sockaddr_in($port, $iaddr);
|
||||
my $proto = getprotobyname("tcp");
|
||||
|
||||
@ -1052,35 +967,16 @@ sub get_new_node
|
||||
}
|
||||
}
|
||||
|
||||
print "# Found port $port\n";
|
||||
|
||||
# Select a host.
|
||||
my $host = $test_pghost;
|
||||
if ($params{own_host})
|
||||
{
|
||||
if ($use_tcp)
|
||||
{
|
||||
# This assumes $use_tcp platforms treat every address in
|
||||
# 127.0.0.1/24, not just 127.0.0.1, as a usable loopback.
|
||||
$last_host_assigned++;
|
||||
$last_host_assigned > 254 and BAIL_OUT("too many own_host nodes");
|
||||
$host = '127.0.0.' . $last_host_assigned;
|
||||
}
|
||||
else
|
||||
{
|
||||
$host = "$test_pghost/$name"; # Assume $name =~ /^[-_a-zA-Z0-9]+$/
|
||||
mkdir $host;
|
||||
}
|
||||
}
|
||||
print "# Found free port $port\n";
|
||||
|
||||
# Lock port number found by creating a new node
|
||||
my $node = $class->new($name, $host, $port);
|
||||
my $node = $class->new($name, $test_pghost, $port);
|
||||
|
||||
# Add node to list of nodes
|
||||
push(@all_nodes, $node);
|
||||
|
||||
# And update port for next time
|
||||
$port_is_forced or $last_port_assigned = $port;
|
||||
$last_port_assigned = $port;
|
||||
|
||||
return $node;
|
||||
}
|
||||
@ -1471,8 +1367,9 @@ $stderr);
|
||||
|
||||
=item $node->command_ok(...)
|
||||
|
||||
Runs a shell command like TestLib::command_ok, but with PGHOST and PGPORT set
|
||||
so that the command will default to connecting to this PostgresNode.
|
||||
Runs a shell command like TestLib::command_ok, but with PGPORT
|
||||
set so that the command will default to connecting to this
|
||||
PostgresNode.
|
||||
|
||||
=cut
|
||||
|
||||
@ -1480,7 +1377,6 @@ sub command_ok
|
||||
{
|
||||
my $self = shift;
|
||||
|
||||
local $ENV{PGHOST} = $self->host;
|
||||
local $ENV{PGPORT} = $self->port;
|
||||
|
||||
TestLib::command_ok(@_);
|
||||
@ -1491,7 +1387,7 @@ sub command_ok
|
||||
|
||||
=item $node->command_fails(...)
|
||||
|
||||
TestLib::command_fails with our connection parameters. See command_ok(...)
|
||||
TestLib::command_fails with our PGPORT. See command_ok(...)
|
||||
|
||||
=cut
|
||||
|
||||
@ -1499,7 +1395,6 @@ sub command_fails
|
||||
{
|
||||
my $self = shift;
|
||||
|
||||
local $ENV{PGHOST} = $self->host;
|
||||
local $ENV{PGPORT} = $self->port;
|
||||
|
||||
TestLib::command_fails(@_);
|
||||
@ -1510,7 +1405,7 @@ sub command_fails
|
||||
|
||||
=item $node->command_like(...)
|
||||
|
||||
TestLib::command_like with our connection parameters. See command_ok(...)
|
||||
TestLib::command_like with our PGPORT. See command_ok(...)
|
||||
|
||||
=cut
|
||||
|
||||
@ -1518,7 +1413,6 @@ sub command_like
|
||||
{
|
||||
my $self = shift;
|
||||
|
||||
local $ENV{PGHOST} = $self->host;
|
||||
local $ENV{PGPORT} = $self->port;
|
||||
|
||||
TestLib::command_like(@_);
|
||||
@ -1529,8 +1423,7 @@ sub command_like
|
||||
|
||||
=item $node->command_checks_all(...)
|
||||
|
||||
TestLib::command_checks_all with our connection parameters. See
|
||||
command_ok(...)
|
||||
TestLib::command_checks_all with our PGPORT. See command_ok(...)
|
||||
|
||||
=cut
|
||||
|
||||
@ -1538,7 +1431,6 @@ sub command_checks_all
|
||||
{
|
||||
my $self = shift;
|
||||
|
||||
local $ENV{PGHOST} = $self->host;
|
||||
local $ENV{PGPORT} = $self->port;
|
||||
|
||||
TestLib::command_checks_all(@_);
|
||||
@ -1561,7 +1453,6 @@ sub issues_sql_like
|
||||
{
|
||||
my ($self, $cmd, $expected_sql, $test_name) = @_;
|
||||
|
||||
local $ENV{PGHOST} = $self->host;
|
||||
local $ENV{PGPORT} = $self->port;
|
||||
|
||||
truncate $self->logfile, 0;
|
||||
@ -1576,8 +1467,8 @@ sub issues_sql_like
|
||||
|
||||
=item $node->run_log(...)
|
||||
|
||||
Runs a shell command like TestLib::run_log, but with connection parameters set
|
||||
so that the command will default to connecting to this PostgresNode.
|
||||
Runs a shell command like TestLib::run_log, but with PGPORT set so
|
||||
that the command will default to connecting to this PostgresNode.
|
||||
|
||||
=cut
|
||||
|
||||
@ -1585,7 +1476,6 @@ sub run_log
|
||||
{
|
||||
my $self = shift;
|
||||
|
||||
local $ENV{PGHOST} = $self->host;
|
||||
local $ENV{PGPORT} = $self->port;
|
||||
|
||||
TestLib::run_log(@_);
|
||||
|
Reference in New Issue
Block a user