diff options
Diffstat (limited to 'src/test/perl/PostgresNode.pm')
-rw-r--r-- | src/test/perl/PostgresNode.pm | 184 |
1 files changed, 37 insertions, 147 deletions
diff --git a/src/test/perl/PostgresNode.pm b/src/test/perl/PostgresNode.pm index 0335ab22f27..044b07790c5 100644 --- a/src/test/perl/PostgresNode.pm +++ b/src/test/perl/PostgresNode.pm @@ -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(@_); |