On 21/08/2021 12:40, Jaikiran Pai wrote:
I was able to reproduce this on a MacOS. However, the continuous integration setup project for Quarkus projects runs these tests against Linux and Windows setups and they have run into this issue at least on the Linux OS jobs (I will need to go and check if Windows jobs had failed too). I can get the specific OS versions if necessary, but I don't think that will be needed (due to the reproducer I explain below).

:

From what I see in the output of this program, the resolution of microprofile.io returns 4 IP addresses. 2 of them are of type IPv4 and 2 are of type IPv6. Across all Java versions, for IPv4 addresses, the connection attempts fail with the same "java.net.SocketTimeoutException: Connect timed out". However, for the IPv6 addresses, in Java 11, the connection attempts fail with "java.net.ConnectException: No route to host (connect failed)" whereas in Java 16, 17 and upstream latest, the connection attempts against the IPv6 addresses fails with "java.net.NoRouteToHostException: No route to host".

Thanks for the additional information, I think I understand the issue now.

If you extend your test to include a connect without a timeout then you'll see that old and new implementations throw NoRouteToHostException when the underlying error is EHOSTUNREACH "No route to host".

However, for the connect with timeout case on Linux/macOS/Unix the old implementation doesn't correctly handle network errors when they are reported immediately. It throws ConnectException for all errors, including EHOSTUNREACH "No route to host", whereas it should map the error to a specific exception as it does for the untimed case. It's possible that this bug has existed for a long time.

So while there is indeed a behavior change between the old and new implementation for the timed case where the connect fails immediately, I don't think we should attempt to change the new implementation to have this buggy behavior.

Do you connections to the Apache HTTP client library and the retry code that is looking for specific exceptions? From a distance it seems very fragile and depending on very implementation specific behavior. I wonder if it has ever been tested on Windows or with an untimed connect.


-Alan

Reply via email to