On Wed, 2 Oct 2024 13:25:54 GMT, Aleksei Efimov <aefi...@openjdk.org> wrote:
> > I think that if there is a PortUnreachable thrown, during DnsClient.query > > processing from the doUdpQuery, then the timeout may expire early ... if > > I've interpreted the outer loop processing correctly > > The `DnsClient.query` marks server as misconfigured (not suitable for further > retries) in scenarios when `PortUnreachable` is caught (see `doNotRetry`). > And since the timeout/retries are specified per server it is expected for the > timeout to expire early. For scenarios with one server and `PortUnreachable` > exception - the `DnsClient.query` will throw the `CommunicationException` > with `PortUnreachable` set as its cause. Here's two set of trace (pre your current change) for the main Timeout test. The second trace is a simulated receipt of an ICMP Host unreachable normal successful execution of Timeout test ----------System.out:(19/715)---------- Skip local DNS Server creation DnsClient.query retry == 0 DnsClient.doUdpQuery pktTimeout == 250 DnsClient.blockingReceive: select with timeout == 250 DnsClient.query retry == 1 DnsClient.doUdpQuery pktTimeout == 500 DnsClient.blockingReceive: select with timeout == 500 DnsClient.query retry == 2 DnsClient.doUdpQuery pktTimeout == 1000 DnsClient.blockingReceive: select with timeout == 1000 DnsClient.query retry == 3 DnsClient.doUdpQuery pktTimeout == 2000 DnsClient.blockingReceive: select with timeout == 2000 DnsClient.query retry == 4 DnsClient.doUdpQuery pktTimeout == 4000 DnsClient.blockingReceive: select with timeout == 4000 Elapsed (ms): 7793 Expected (ms): 7750 elapsed time is as long as expected. ----------System.err:(18/768)---------- DNS: SEND ID (1): 29440 DNS: Trying RECEIVE(1) retry(1) for:29440 sock-timeout:250 ms. DNS: Caught IOException:java.net.SocketTimeoutException DNS: SEND ID (2): 29440 DNS: Trying RECEIVE(1) retry(2) for:29440 sock-timeout:500 ms. DNS: Caught IOException:java.net.SocketTimeoutException DNS: SEND ID (3): 29440 DNS: Trying RECEIVE(1) retry(3) for:29440 sock-timeout:1000 ms. DNS: Caught IOException:java.net.SocketTimeoutException DNS: SEND ID (4): 29440 DNS: Trying RECEIVE(1) retry(4) for:29440 sock-timeout:2000 ms. DNS: Caught IOException:java.net.SocketTimeoutException DNS: SEND ID (5): 29440 DNS: Trying RECEIVE(1) retry(5) for:29440 sock-timeout:4000 ms. DNS: Caught IOException:java.net.SocketTimeoutException --------------oOo---------------- timeout failure due to PortUnreachableException ----------System.out:(12/392)---------- Skip local DNS Server creation DnsClient.query retry == 0 DnsClient.doUdpQuery pktTimeout == 250 DnsClient.blockingReceive: select with timeout == 250 DnsClient.query retry == 1 DnsClient.doUdpQuery pktTimeout == 500 DnsClient.blockingReceive: select with timeout == 500 DnsClient.query retry == 2 DnsClient.query retry == 3 DnsClient.query retry == 4 Elapsed (ms): 777 Expected (ms): 7750 ----------System.err:(21/1055)---------- DNS: SEND ID (1): 27504 DNS: Trying RECEIVE(1) retry(1) for:27504 sock-timeout:250 ms. DNS: Caught IOException:java.net.SocketTimeoutException DNS: SEND ID (2): 27504 DNS: Trying RECEIVE(1) retry(2) for:27504 sock-timeout:500 ms. DNS: Caught IOException:java.net.SocketTimeoutException DNS: SEND ID (3): 27504 DNS: Caught Exception:java.net.PortUnreachableException: simulated ICMP Host unreachable java.lang.RuntimeException: Failed: timeout in 777 ms, expected7750ms at Timeout.handleException(Timeout.java:116) at TestBase.launch(TestBase.java:84) at TestBase.run(TestBase.java:50) at Timeout.main(Timeout.java:59) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) at java.base/java.lang.reflect.Method.invoke(Method.java:588) at com.sun.javatest.regtest.agent.MainActionHelper$AgentVMRunnable.run(MainActionHelper.java:333) at java.base/java.lang.Thread.run(Thread.java:1575) JavaTest Message: Test threw exception: java.lang.RuntimeException JavaTest Message: shutting down test result: Failed. Execution failed: `main' threw exception: java.lang.RuntimeException: Failed: timeout in 777 ms, expected7750ms test result: Failed. Execution failed: `main' threw exception: java.lang.RuntimeException: Failed: timeout in 777 ms, expected7750ms So if a PortUnreachableException is thrown, which can happen for either a send or receive anytime after the first iteration through the retry loop, then there will be an early timeout. As such, your assertion does not appear to be true. ------------- PR Comment: https://git.openjdk.org/jdk/pull/20892#issuecomment-2389979568