]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Only ever test for non-127.0.0.1 addresses on Windows in PostgresNode
authorAndrew Dunstan <andrew@dunslane.net>
Wed, 21 Apr 2021 14:21:22 +0000 (10:21 -0400)
committerAndrew Dunstan <andrew@dunslane.net>
Wed, 21 Apr 2021 14:30:26 +0000 (10:30 -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 0b07f3947cb6c69dcf9de7f78384ebb4857d2639..0ed0114a99beeefb6fed7dd605b2bd719371f2c6 100644 (file)
@@ -977,28 +977,25 @@ sub get_new_node
                        $found = 0 if ($node->port == $port);
                }
 
-               # Check to see if anything else is listening on this TCP port.  This
-               # is *necessary* on $use_tcp (Windows) configurations.  Seek a port
-               # available for all possible listen_addresses values, for own_host
-               # nodes and so the caller 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.
+               # 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 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.
                #
-               # This seems like a good idea on Unixen as well, even though we don't
-               # ask the postmaster to open a TCP port on Unix.  On Non-Linux,
-               # non-Windows kernels, binding to 127.0.0.1/24 addresses other than
-               # 127.0.0.1 might fail with EADDRNOTAVAIL.  Binding to 0.0.0.0 is
-               # unnecessary on non-Windows systems.
-               #
-               # XXX A port available now may become unavailable by the time we start
-               # the postmaster.
+               # 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)
+               : ())
                        {
                                can_bind($addr, $port) or $found = 0;
                        }