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

Reply via email to