[JDK-8257080] Java does not try all DNS results when opening a socket
Alan Bateman
Alan.Bateman at oracle.com
Wed Dec 16 08:41:44 UTC 2020
On 16/12/2020 08:09, Benjamin Marwell wrote:
> Hello everyone,
>
> I would like to bring up the enhancement JDK-8257080[1] on this
> mailing list.
>
> tl;dr symptoms:
> Java will use the first IP address from DNS and will fail to connect
> when the target host is offline, even when the other IPs would have
> worked. This is also true for the more recent Socket implementations
> from Java 14 onwards..
>
> Proposed resolution:
> Implementation similar to python. Late(r) DNS resolution when the
> socket is being opened (i.e. a target port is known), then iterate
> over IP addresses returned by DNS and try a socket_open.
>
I can't tell if your proposal is focused on the Socket constructors that
take a hostname or more generally changing all APIs that connect to a
SocketAddress to support connecting to an isUnresolved
InetSocketAddress. There is merit into exploring this, as is exploring
new APIs. Experience with Python and other run-times would be useful. I
could imagine prototypes that range from a simple API that iterates
through the IP address to implementations of the Happy Eyeballs RFC and
other algorithms to improve the user experience when a connection is
slow to establish. There is synergy between such exploration and other
efforts, including the ongoing work to add a service provider interface
for name resolution that will open the door to improved APIs for user
facing applications.
-Alan
More information about the net-dev
mailing list