On Thu, Apr 14, 2016 at 9:38 AM, Michael Paquier <michael.paqu...@gmail.com> wrote: > IO::Socket::INET is another option, but I am not seeing it in perl < > 5.12, and that's not part of ActivePerl, which makes life harder on > Windows. Socket is available on both. Does that address your concerns?
And this gives the patch attached, just took the time to hack it. -- Michael
diff --git a/src/test/perl/PostgresNode.pm b/src/test/perl/PostgresNode.pm index e42c117..1f38640 100644 --- a/src/test/perl/PostgresNode.pm +++ b/src/test/perl/PostgresNode.pm @@ -90,6 +90,7 @@ use File::Spec; use File::Temp (); use IPC::Run; use RecursiveCopy; +use Socket; use Test::More; use TestLib (); use Scalar::Util qw(blessed); @@ -842,16 +843,32 @@ sub get_new_node # wrap correctly around range end $port = 49152 if ++$port >= 65536; print "# Checking for port $port\n"; - if (!TestLib::run_log([ 'pg_isready', '-p', $port ])) + $found = 1; + + # Found a potential candidate port number. Check first that it is + # not included in the list of registered nodes. + foreach my $node (@all_nodes) { - $found = 1; + $found = 0 if ($node->port == $port); + } - # Found a potential candidate port number. Check first that it is - # not included in the list of registered nodes. - foreach my $node (@all_nodes) - { - $found = 0 if ($node->port == $port); - } + # On non-Windows, port unicity is ensured by the unique Unix socket + # directory where all the nodes registered in a given test are + # listening, and this directory is different for each test. On + # Windows though, all the nodes registered in a test are listening + # to localhost, other PostgreSQL instances running on a server as + # well as anything else listening to a port may cause failures, + # so check if a given port is already listening to TCP connections + # before deciding if it can safely be used or not. + if ($found == 1 && $TestLib::windows_os) + { + my $iaddr = inet_aton($ENV{PGHOST}); + my $paddr = sockaddr_in("$port", $iaddr); + my $proto = getprotobyname("tcp"); + + socket(SOCK, PF_INET, SOCK_STREAM, $proto) or die; + $found = 0 if connect(SOCK, $paddr); + close(SOCK); } }
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers