OpenJDK SADebugDTest.java test : handling of "Address already in use"

Yasumasa Suenaga suenaga at oss.nttdata.com
Fri Dec 31 09:49:02 UTC 2021


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