Only ever test for non-127.0.0.1 addresses on Windows in PostgresNode

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
This commit is contained in:
Andrew Dunstan 2021-04-21 10:21:22 -04:00
parent 7bfba4f193
commit d31ae92866

View File

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