Only ever test for non-127.0.0.1 addresses on Windows in PostgresNode
authorAndrew Dunstan
Wed, 21 Apr 2021 14:21:22 +0000 (10:21 -0400)
committerAndrew Dunstan
Wed, 21 Apr 2021 14:25:23 +0000 (10:25 -0400)
This has been found to cause hangs where tcp usage is forced.

Alexey Kodratov

Discussion: https://postgr.es/m/82e271a9a11928337fcb5b5e57b423c0@postgrespro.ru

Backpatch to all live branches

src/test/perl/PostgresNode.pm

index 5b19c23e5055b932df978220bd32fe8c7749cacf..f5a8325c999bfd9742ae467dc38ff9d4c29bfd90 100644 (file)
@@ -1188,19 +1188,22 @@ sub get_free_port
        # Check to see if anything else is listening on this TCP port.
        # Seek a port available for all possible listen_addresses values,
        # so callers can harness this port for the widest range of purposes.
-       # The 0.0.0.0 test achieves that for post-2006 Cygwin, which
-       # automatically sets SO_EXCLUSIVEADDRUSE.  The same holds for MSYS (a
-       # Cygwin fork).  Testing 0.0.0.0 is insufficient for Windows native
-       # Perl (https://stackoverflow.com/a/14388707), so we also test
-       # individual addresses.
+       # The 0.0.0.0 test achieves that for MSYS, which automatically sets
+       # SO_EXCLUSIVEADDRUSE.  Testing 0.0.0.0 is insufficient for Windows
+       # native Perl (https://stackoverflow.com/a/14388707), so we also
+       # have to test individual addresses.  Doing that for 127.0.0/24
+       # addresses other than 127.0.0.1 might fail with EADDRNOTAVAIL on
+       # non-Linux, non-Windows kernels.
        #
-       # On non-Linux, non-Windows kernels, binding to 127.0.0/24 addresses
-       # other than 127.0.0.1 might fail with EADDRNOTAVAIL.  Binding to
-       # 0.0.0.0 is unnecessary on non-Windows systems.
+       # Thus, 0.0.0.0 and individual 127.0.0/24 addresses are tested
+       # only on Windows and only when TCP usage is requested.
        if ($found == 1)
        {
            foreach my $addr (qw(127.0.0.1),
-               $use_tcp ? qw(127.0.0.2 127.0.0.3 0.0.0.0) : ())
+               $use_tcp ? qw(127.0.0.2 127.0.0.3 0.0.0.0) : ())
+               $use_tcp && $TestLib::windows_os
+               ? qw(127.0.0.2 127.0.0.3 0.0.0.0)
+               : ())
            {
                if (!can_bind($addr, $port))
                {