[prev in list] [next in list] [prev in thread] [next in thread] 

List:       openjdk-serviceability-dev
Subject:    Re: OpenJDK SADebugDTest.java test : handling of "Address already in use"
From:       Yasumasa Suenaga <suenaga () oss ! nttdata ! com>
Date:       2021-12-31 13:42:41
Message-ID: 579c774d38b04f4760cd853b9d746723 () oss ! nttdata ! com
[Download RAW message or body]

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
> > 


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic