OpenJDK SADebugDTest.java test : handling of "Address already in use"
Yasumasa Suenaga
suenaga at oss.nttdata.com
Fri Dec 31 13:42:41 UTC 2021
I've sent PR for this problem:
https://github.com/openjdk/jdk/pull/6941
> `testResult` and `portInUse` are important variables in this logic,
> however they are overwritten in lambda expression - they won't affect
> to the caller.
> (I wonder why the test can compile without any error...)
They are class member, so they work fine.
However it is a little confusing, so I refactored it in this PR.
Thanks,
Yasumasa
2021-12-31 18:49 に Yasumasa Suenaga さんは書きました:
> Hi Matthias,
>
> I think SADebugDTest.java wouldn't work that we expect.
>
> ```
> 114 Process debugd = startProcess("debugd", pb, null,
> 115 l -> {
> 116 if (!useRmiPort && l.contains(GOLDEN))
> {
> 117 testResult = true;
> 118 } else if (useRmiPort &&
> l.contains(RMI_CONNECTOR_IS_BOUND + finalRmiPort)) {
> 119 testResult = true;
> 120 } else if
> (l.contains(ADDRESS_ALREADY_IN_USE)) {
> 121 portInUse = true;
> 122 }
> 123 return (l.contains(GOLDEN) ||
> portInUse);
> 124 }, 20, TimeUnit.SECONDS);
> ```
>
> `testResult` and `portInUse` are important variables in this logic,
> however they are overwritten in lambda expression - they won't affect
> to the caller.
> (I wonder why the test can compile without any error...)
>
> Anyway, we should fix it. I will fix and will send PR.
>
>
> Thanks,
>
> Yasumasa
>
>
> On 2021/12/30 17:29, Baesken, Matthias wrote:
>> Hello, I have a question regarding the test SADebugDTest.java .
>>
>> The test
>>
>> https://github.com/openjdk/jdk/blob/master/test/hotspot/jtreg/serviceability/sa/sadebugd/SADebugDTest.java
>> <https://github.com/openjdk/jdk/blob/master/test/hotspot/jtreg/serviceability/sa/sadebugd/SADebugDTest.java>
>>
>> seems to handle already cases where “Address already in use” is found
>> in the output (see line 120 ).
>>
>> However in our nightly test, the SADebugDTest.java fails with this
>> output :
>>
>> LingeredApp stdout: [];
>>
>> LingeredApp stderr: []
>>
>> LingeredApp exitValue = 0
>>
>> ----------System.err:(17/1318)----------
>>
>> [debugd] Attaching to process ID 372 and starting RMI services, please
>> wait...
>>
>> [debugd] Error attaching to process or starting server:
>> sun.jvm.hotspot.debugger.DebuggerException:
>> java.rmi.server.ExportException: Port already in use: 39399; nested
>> exception is:
>>
>> *[debugd] java.net.BindException: Address already in use*
>>
>> [debugd] at
>> jdk.hotspot.agent/sun.jvm.hotspot.HotSpotAgent.setupDebugger(HotSpotAgent.java:384)
>>
>> java.lang.RuntimeException: Expected message "RMI connector is bound
>> to port 39399" is not found in the output.
>>
>> at SADebugDTest.testWithPid(SADebugDTest.java:132)
>>
>> at SADebugDTest.runTests(SADebugDTest.java:68)
>>
>> at SADebugDTest.main(SADebugDTest.java:60)
>>
>> at
>> java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
>>
>> at java.base/java.lang.reflect.Method.invoke(Method.java:577)
>>
>> at
>> com.sun.javatest.regtest.agent.MainWrapper$MainThread.run(MainWrapper.java:127)
>>
>> at java.base/java.lang.Thread.run(Thread.java:833)
>>
>> JavaTest Message: Test threw exception: java.lang.RuntimeException:
>> Expected message "RMI connector is bound to port 39399" is not found
>> in the output.
>>
>> JavaTest Message: shutting down test
>>
>> Looks like the *ADDRESS_ALREADY_IN_USE *string is checked below;
>> however later in the coding portInUse is not checked but the
>> RuntimeException “Expected message . . .” is thrown :
>>
>> Process debugd = startProcess("debugd", pb, null,
>>
>> l -> {
>>
>> if (!useRmiPort && l.contains(GOLDEN)) {
>>
>> testResult = true;
>>
>> } else if (useRmiPort &&
>> l.contains(RMI_CONNECTOR_IS_BOUND + finalRmiPort)) {
>>
>> testResult = true;
>>
>> * } else if
>> (l.contains(ADDRESS_ALREADY_IN_USE)) {*
>>
>> * portInUse = true;*
>>
>> }
>>
>> return (l.contains(GOLDEN) || portInUse);
>>
>> }, 20, TimeUnit.SECONDS);
>>
>> // If we are here, this means we have received the
>> golden line and the test has passed
>>
>> // The debugd remains running, we have to kill it
>>
>> debugd.destroy();
>>
>> debugd.waitFor();
>>
>> * if (!testResult) {*
>>
>> * throw new RuntimeException("Expected message \""
>> +*
>>
>> * RMI_CONNECTOR_IS_BOUND + rmiPort + "\" is
>> not found in the output.");*
>>
>> * }*
>>
>> } while (portInUse); // Repeat the test if the port is
>> already in use
>>
>> Is this really intended ? from the comments in the test I had the
>> impression that in case of “port in use” / “address already in
>> use” the test should be repeated ?
>>
>> Otherwise if this is intended, should we flag the test with @key
>> intermittent ?
>>
>> Thanks and best regards, Matthias
>>
More information about the serviceability-dev
mailing list