• Tom Lane's avatar
    Improve PostgresNode.pm's logic for detecting already-in-use ports. · fab84c77
    Tom Lane authored
    Buildfarm members bowerbird and jacana have shown intermittent "could not
    bind IPv4 socket" failures in the BinInstallCheck stage since mid-December,
    shortly after commits 1caef31d and 9821492e changed the
    logic for selecting which port to use in temporary installations.  One
    plausible explanation is that we are randomly selecting ports that are
    already in use for some non-Postgres purpose.  Although the code tried
    to defend against already-in-use ports, it used pg_isready to probe
    the port which is quite unhelpful: if some non-Postgres server responds
    at the given address, pg_isready will generally say "no response",
    leading to exactly the wrong conclusion about whether the port is free.
    
    Instead, let's use a simple TCP connect() call to see if anything answers
    without making assumptions about what it is.  Note that this means there's
    no direct check for a conflicting Unix socket, but that should be okay
    because there should be no other Unix sockets in use in the temporary
    socket directory created for a test run.
    
    This is only a partial solution for the TCP case, since if the port number
    is in use for an outgoing connection rather than a listening socket, we'll
    fail to detect that.  We could try to bind() to the proposed port as a
    means of detecting that case, but that would introduce its own failure
    modes, since the system might consider the address to remain reserved for
    some period of time after we drop the bound socket.  Close study of the
    errors returned by bowerbird and jacana suggests that what we're seeing
    there may be conflicts with listening not outgoing sockets, so let's try
    this and see if it improves matters.  It's certainly better than what's
    there now, in any case.
    
    Michael Paquier, adjusted by me to work on non-Windows as well as Windows
    fab84c77
PostgresNode.pm 29.2 KB