From d064afc7204b52cb78a83fea0e686693ce5ba00c Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Wed, 21 Apr 2021 10:21:22 -0400 Subject: [PATCH] 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 --- src/test/perl/PostgresNode.pm | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/test/perl/PostgresNode.pm b/src/test/perl/PostgresNode.pm index b32223f716..8394c57d3f 100644 --- a/src/test/perl/PostgresNode.pm +++ b/src/test/perl/PostgresNode.pm @@ -1332,19 +1332,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)) {