JEP-353 - Socket.connect now throws NoRouteToHostException as against ConnectException previously
Alan Bateman
Alan.Bateman at oracle.com
Sat Aug 21 08:51:26 UTC 2021
On 21/08/2021 08:17, Jaikiran Pai wrote:
> JEP-353[1] which got implemented and released in JDK13, states:
>
> "The java.net package defines many sub-classes of SocketException. The
> new implementation will attempt to throw the same specific
> SocketException as the old implementation but there may be cases where
> they are not the same."
>
> In one of the projects I watch, a recent issue[2] shows that the
> "Socket.connect(...)" call, in certain cases, now throws a
> "java.net.NoRouteToHostException" exception as opposed to
> "java.net.ConnectException" in previous versions before this change.
> The "Socket.connect(...)" javadoc states that this API can throw an
> "IOException", so this change, in theory, is still fine and doesn't
> break any API contract. However, as noted in [2], certain libraries
> (Apache HTTP client 4.5.x versions in this case) expect a certain
> exception type when it's dealing with decision making for HTTP request
> retries. Due to this change in the exception type being thrown, the
> Apache HTTP client library now behaves differently in Java 11 and Java
> 16.
>
> Is this change of exception type being thrown intentional? Or is there
> interest in changing back to the previous exception type to preserve
> backward compatibility? If not, I think the Apache HTTP client library
> will have to perhaps do certain changes to have this part of the code
> behave the same across Java versions.
Thanks for the mail, I haven't seen any other reports on this.
Can you say which operating system and say a bit more about the
conditions where this is observed? When connecting to a host that is not
reachable then it's possible for the underlying connect to fail with a
"Connection timed out", "No route to host", or other errors.
The reason I'm asking about the OS/conditions is that the old
implementation did attempt to map specific errors to
NoRouteToHostException. There's an example stack stack (Windows, with
JDK 9) in this bug report:
https://bugs.openjdk.java.net/browse/JDK-8042714
In general, the mapping of connect errors to sub-classes of
SocketException has always been best effort and I both both
ConnectException and NoRouteToHostException are possible, all depends on
the underlying error.
So my initial reaction is that we shouldn't do anything right now, I
think we need to know a bit more abut the environment/conditions as I'm
puzzled as to why the HTTP client retry decision didn't run into this
before with the old implementation.
-Alan
More information about the net-dev
mailing list