Thanks!
Daniil
On 2/27/19, 12:08 PM, "Chris Plummer" <[email protected]> wrote:
Hi Daniil,
In exclfilter001.java, since the first revision you changed the while
loop to be "while (true)". I'm not sure of the reasoning. It used to
exit the first time remove() didn't return an EventSet. Now it retries
until the total waittime is exceeded.
When waiting for an event, sometimes you use:
91 eventWaitTime =
Utils.adjustTimeout(argHandler.getWaitTime() * 10000);
and sometimes:
153 long waitTime = Utils.adjustTimeout(1000);
Why the discrepancy. In one case you are willing to wait 50 seconds for
an event and in the other only 5.
I think you missed my initial comment on Utils.java. See below:
> In Utils.java, I think wait() should be moved right after
> waitForCondition() and maybe given a more descriptive name. It seems
> to basically the same as waitForCondition(), except you added a "log"
> parameter and slightly changed the behavior. Are these behavior
> differences necessary? Could you share code with the existing
> waitForCondition()?
thanks,
Chris
On 2/27/19 9:03 AM, Daniil Titov wrote:
> Hi Serguei and Chris,
>
> Thank you for reviewing this change. Please review a new version of the
fix that addresses these findings.
>
> Bug: https://bugs.openjdk.java.net/browse/JDK-8207367
> Webrev: http://cr.openjdk.java.net/~dtitov/8207367/webrev.03
>
> Best regards,
> Daniil
>
> From: <[email protected]>
> Organization: Oracle Corporation
> Date: Tuesday, February 26, 2019 at 6:50 PM
> To: Daniil Titov <[email protected]>, Chris Plummer
<[email protected]>, OpenJDK Serviceability <[email protected]>
> Subject: Re: RFR 8207367: 10 vmTestbase/nsk/jdi tests timed out when
running with jtreg
>
> Hi Daniil,
>
> It looks good to me.
> I have some minor comments though.
>
http://cr.openjdk.java.net/~dtitov/8207367/webrev.02/test/hotspot/jtreg/vmTestbase/nsk/jdi/ClassUnloadRequest/addClassFilter/filter001.java.frames.html
>
> 163 if(eventSet != null) {
> Space is missed after if
>
>
>
http://cr.openjdk.java.net/~dtitov/8207367/webrev.02/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventQueue/remove/remove004.java.frames.html
> 70 * In first one, second thread waits for any incoming event from the
<BR>
> 71 * debugger which is sleeping for some time; hence, <BR>
> 72 * no events are expected to be received at the debugger end.
<BR>
> <BR> is not aligned at 71
>
>
> While you are at this code, could you, please,
> also fix unneeded spaces at the lines? :
> 516 } catch ( InterruptedException e1) {
> ...
> 526 } catch ( Exception e ) {
>
>
http://cr.openjdk.java.net/~dtitov/8207367/webrev.02/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventQueue/remove/remove004a.java.frames.html
> 111
Utils.adjustTimeout(argHandler.getWaitTime() * 10000),
> 112 100,
> 113 remove004a::log1);
> Line 112 is not properly aligned
>
>
>
http://cr.openjdk.java.net/~dtitov/8207367/webrev.02/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventQueue/remove_l/remove_l004.java.frames.html
> 65 * In the first one the first assertion is checked up on as follows:
<BR>
> 66 * the debugger sleeps for some time;
<BR>
> 67 * hence, no event is expected in the debugger within WAITTIME, and
<BR>
> <BR> at 66 is not aligned
> Thank you for catching and fixing the typo at 67!
>
>
http://cr.openjdk.java.net/~dtitov/8207367/webrev.02/test/hotspot/jtreg/vmTestbase/nsk/jdi/VirtualMachine/dispose/dispose002.java.frames.html
>
> 295 }, Utils.adjustTimeout(waitTime * 60000),
1000, dispose002::log3);
> A separate line is needed for next wait() argument
>
>
>
http://cr.openjdk.java.net/~dtitov/8207367/webrev.02/test/hotspot/jtreg/vmTestbase/nsk/jdi/VirtualMachine/dispose/dispose002a.java.frames.html
> 128 while(true) {
> ...
> 130 if(instruction.equals("check_done")){
> 131 if (test_thread.isAlive()) {
> 132 exitCode = FAILED;
> 133 }
>
> Space is missed after while.
> Some logErr("...") for failed case would be useful.
>
>
>
http://cr.openjdk.java.net/~dtitov/8207367/webrev.02/test/hotspot/jtreg/vmTestbase/nsk/jdi/VirtualMachine/dispose/dispose003.java.frames.html
> 260 }, Utils.adjustTimeout(waitTime * 60000),
1000, dispose003::log3);
> New line is needed for next wait() argument
>
>
>
http://cr.openjdk.java.net/~dtitov/8207367/webrev.02/test/hotspot/jtreg/vmTestbase/nsk/jdi/VirtualMachine/dispose/dispose003a.java.frames.html
> 129 while(true) {
> 130 instruction = pipe.readln();
> 131 if(instruction.equals("check_done")) {
> 132 if (test_thread.isAlive()) {
> 133 exitCode = FAILED;
> 134 }
> Space is missed after while and if.
> Some logErr("...") for failed case would be useful.
>
>
http://cr.openjdk.java.net/~dtitov/8207367/webrev.02/test/hotspot/jtreg/vmTestbase/nsk/jdi/VirtualMachine/dispose/dispose004.java.frames.html
> 284 }, Utils.adjustTimeout(waitTime * 60000),
1000, dispose004::log3);
> New line is needed for next wait() argument
>
>
>
http://cr.openjdk.java.net/~dtitov/8207367/webrev.02/test/hotspot/jtreg/vmTestbase/nsk/jdi/VirtualMachine/dispose/dispose004a.java.frames.html
> 130 while(true) {
> 131 instruction = pipe.readln();
> 132 if(instruction.equals("check_done")) {
> 133 if (test_thread.isAlive()) {
> 134 exitCode = FAILED;
> 135 }
> Space is missed after while and if.
> Some logErr("...") for failed case would be useful.
>
>
> Thanks,
> Serguei
>
> On 2/26/19 6:06 PM, Daniil Titov wrote:
> Hi Chris,
>
> Please review a new version of the webrev that slightly changes method
receiveEvents(long,pattern) in the following tests:
>
-vmTestbase/nsk/jdi/ClassUnloadRequest/addClassExclusionFilter/exclfilter001.java
> -vmTestbase/nsk/jdi/ClassUnloadRequest/addClassFilter/filter001.java)
>
>
> The new changes ensure that receiveEvents(long,pattern) method keeps
receiving events in a while loop even if eventSet returned by
debugee.VM().eventQueue().remove(waitTime) is a null due to timeout.
>
>
> Bug: https://bugs.openjdk.java.net/browse/JDK-8207367
> Webrev: http://cr.openjdk.java.net/~dtitov/8207367/webrev.02
>
> Thanks!
> -Daniil
>
> On 2/26/19, 11:41 AM, "Chris Plummer" mailto:[email protected]
wrote:
>
> Ok. I think you mentioned below that default wait time will be 5
> seconds. That seems sufficient to avoid a timeout if there are some
> minor network issues and some packets are lost.
>
> Changes look good.
>
> thanks,
>
> Chris
>
> On 2/26/19 10:01 AM, Daniil Titov wrote:
> > Hi Chris,
> >
> > Yes , it is correct. For example in this particular test the
timeout is expected (line 283 expects that breakpoint() returns returnCode3 that is
set on line 460 when eventSet on line 456 is null due to a timeout in
eventQueue.remove()) and shortening it makes the whole test fit in jtreg time limits.
> >
> > 281 log2(" checking up that the thread2
is not at breakpoint1 because of suspension");
> > 282 expresult = breakpoint();
> > 283 if (expresult != returnCode3) {
> > 284 log3("ERROR: no timeout for waiting
for BreakpointEvent when the thread2 is suspended");
> > 285 expresult = returnCode1;
> > 286 break label1;
> > 287 } else
> >
> >
> > 445 private int breakpoint () {
> > 446
> > 447 int returnCode = returnCode0;
> > 448
> > 449 log2(" waiting for BreakpointEvent");
> > 450
> > 451 labelBP:
> > 452 for (;;) {
> > 453
> > 454 log2(" new: eventSet =
eventQueue.remove();");
> > 455 try {
> > 456 eventSet = eventQueue.remove
(Utils.adjustTimeout(waitTime*1000));
> > 457 if (eventSet == null) {
> > 458 log2(":::::: timeout when waiting
for a BreakpintEvent");
> > 459 // log3("ERROR: timeout for
waiting for a BreakpintEvent");
> > 460 returnCode = returnCode3;
> > 461 break labelBP;
> > 462 }
> >
> >> And I just noticed the space right after "remove". Can you
remove it?
> > Sure. Will do.
> >
> > Thanks!
> > --Daniil
> >
> > On 2/25/19, 7:26 PM, "Chris Plummer"
mailto:[email protected] wrote:
> >
> > Hi Daniil,
> >
> > For suspend001, are you saying the following is expected to
timeout
> > sometimes, so you need a shorter waittime to avoid making
the whole test
> > time out?
> >
> > 456 eventSet = eventQueue.remove
> > (Utils.adjustTimeout(waitTime*1000));
> >
> > And I just noticed the space right after "remove". Can you
remove it?
> >
> > thanks,
> >
> > Chris
> >
> > On 2/25/19 6:57 PM, Daniil Titov wrote:
> > > Hi Chris,
> > >
> > > The timeout issue mentioned in the bug is about jtreg
aborting the tests since they are running longer than the maximum allowed time. That
happens since these tests use extreme long internal delays, e.g. a sleep for 5 minutes
or a wait for 5 minutes for a case when no events ( and a notify()) are expected.
Reducing these internal delays makes the test passing within the default jtreg timeout (
2 minutes).
> > >
> > > Best regards,
> > > Daniil
> > >
> > > On 2/25/19, 6:15 PM, "Chris Plummer"
mailto:[email protected] wrote:
> > >
> > > Ok. So how is the timeout issue mentioned in the bug
addressed when
> > > there is now a shorter wait time?
> > >
> > > Chris
> > >
> > > On 2/25/19 5:04 PM, Daniil Titov wrote:
> > > > Hi Chris,
> > > >
> > > > Forgot to answer to your another question:
> > > > > > For these 3 tests the event wait timeout
was reduced and adjusted for test.timeout.factor:
> > > > > >
-vmTestbase/nsk/jdi/Event/_itself_/event001.java
> > > > > >
-vmTestbase/nsk/jdi/VirtualMachine/suspend/suspend001/TestDescription.java
> > > > > >
-vmTestbase/nsk/jdi/ThreadReference/suspend/suspend001.java
> > > > > So overall is this a shorter or longer
waittime now?
> > > >
> > > > Overall this is a shorter waitime now. Instead of
300 seconds it is now 20 seconds for Mach5 jobs (they are run with test.timeout.factor set
to 4.0) and 5 seconds for regular jtreg runs.
> > > >
> > > > Best regards,
> > > > Daniil
> > > >
> > > >
> > > > On 2/25/19, 4:38 PM, "Chris Plummer"
mailto:[email protected] wrote:
> > > >
> > > > Hi Daniil,
> > > >
> > > > Yes, my point was that the max time you wait
for a single event is much
> > > > smaller now. I can see a possibility that with
a little bit of network
> > > > instability a packet gets lost and resend
does not happen fast enough.
> > > >
> > > > thanks,
> > > >
> > > > Chris
> > > >
> > > > On 2/25/19 4:32 PM, Daniil Titov wrote:
> > > > > Hi Chris,
> > > > >
> > > > > The code still waits for the whole total
wait time. There is a while loop at lines 163-186 that keeps receiving new events (line 183)
till elapsed time is less than the waittime (line 178) or a timeout happens (so eventSet is
null).
> > > > >
> > > > > 159 begin =
System.currentTimeMillis();
> > > > > 160 eventSet =
debugee.VM().eventQueue().remove(waitTime);
> > > > > 161 delta =
System.currentTimeMillis() - begin;
> > > > > 162 totalWaitTime -=
delta;
> > > > > 163 while (eventSet !=
null) {
> > > > > 164 EventIterator
eventIterator = eventSet.eventIterator();
> > > > >
> > > > > 178 if (totalWaitTime
<= 0 || exit) {
> > > > > 179 break;
> > > > > 180 }
> > > > > 181
debugee.resume();
> > > > > 182 begin =
System.currentTimeMillis();
> > > > > 183 eventSet =
debugee.VM().eventQueue().remove(waitTime);
> > > > > 184 delta =
System.currentTimeMillis() - begin;
> > > > > 185 totalWaitTime
-= delta;
> > > > > 186 }
> > > > >
> > > > >
> > > > > However, as I see now in case if a timeout
happens on line 160 (eventSet is null) the loop is not executed at all. I haven't observed
it in test runs but I think it makes sense to adjust this test to take this potential case
into account. I will send an updated version of the patch soon.
> > > > >
> > > > > Thanks!
> > > > >
> > > > > Best regards,
> > > > > Daniil
> > > > >
> > > > > On 2/25/19, 12:21 PM, "Chris Plummer"
mailto:[email protected] wrote:
> > > > >
> > > > > Hi Daniil,
> > > > >
> > > > > On 2/23/19 1:02 PM, Daniil Titov wrote:
> > > > > > Please review the change that fixes
timeout issues for the following 10 tests when running with jtreg and default timeout factor
(1.0).
> > > > > In Utils.java, I think wait() should be
moved right after
> > > > > waitForCondition() and maybe given a
more descriptive name. It seems to
> > > > > basically the same as waitForCondition(), except
you added a "log"
> > > > > parameter and slightly changed the
behavior. Are these behavior
> > > > > differences necessary? Could you share
code with the existing
> > > > > waitForCondition()?
> > > > > >
> > > > > > For the following 2 tests the event
wait timeout was reduced and adjusted for test.timeout.factor. Method
receiveEvents(long,pattern) was fixed to ensure that it gracefully exits after the specified wait
period elapsed:
> > > > > >
-vmTestbase/nsk/jdi/ClassUnloadRequest/addClassExclusionFilter/exclfilter001.java
> > > > > >
-vmTestbase/nsk/jdi/ClassUnloadRequest/addClassFilter/filter001.java
> > > > > 183 eventSet =
debugee.VM().eventQueue().remove(waitTime);
> > > > >
> > > > > This code used to wait for the total
remaining waittime. Now it waits a
> > > > > fixed amount based on:
> > > > >
> > > > > 153 long waitTime =
Utils.adjustTimeout(1000);
> > > > >
> > > > > How did you come up with this wait
amount, and is it long enough to deal
> > > > > with occasional hiccups?
> > > > > > For these 3 tests the event wait
timeout was reduced and adjusted for test.timeout.factor:
> > > > > >
-vmTestbase/nsk/jdi/Event/_itself_/event001.java
> > > > > >
-vmTestbase/nsk/jdi/VirtualMachine/suspend/suspend001/TestDescription.java
> > > > > >
-vmTestbase/nsk/jdi/ThreadReference/suspend/suspend001.java
> > > > > So overall is this a shorter or longer
waittime now?
> > > > > >
> > > > > > For next 2 tests the event wait
timeout and the thread sleep time were reduced and adjusted for test.timeout.factor. Additional
synchronization between the debugger and the debuggee was added to ensure the debugee process
continues as soon as the test finishes the timeout related checks and advances to the next steps:
> > > > > > -
vmTestbase/nsk/jdi/EventQueue/remove_l/remove_l004/TestDescription.java
> > > > > > -
vmTestbase/nsk/jdi/EventQueue/remove/remove004/TestDescription.java
> > > > > Ok.
> > > > > >
> > > > > > Instead of just sleeping for 5
minutes while waiting for the debuggee test thread to complete the tests now check whether the
debuggee thread is alive in the loop. The total waiting timeout was adjusted for
test.timeout.factor:
> > > > > >
-vmTestbase/nsk/jdi/VirtualMachine/dispose/dispose004/TestDescription.java
> > > > > >
-vmTestbase/nsk/jdi/VirtualMachine/dispose/dispose003/TestDescription.java
> > > > > >
-vmTestbase/nsk/jdi/VirtualMachine/dispose/dispose002/TestDescription.java
> > > > > Ok.
> > > > >
> > > > > thanks,
> > > > >
> > > > > Chris
> > > > > >
> > > > > > Testing.
> > > > > > The following VM options were used
in Mach5 jobs to verify these changes:
> > > > > > 1. No VM args
> > > > > > 2. -XX:+UnlockExperimentalVMOptions
-XX:+EnableJVMCI -XX:+TieredCompilation -XX:+UseJVMCICompiler -Djvmci.Compiler=grail
> > > > > > 3. -Xcomp
> > > > > >
> > > > > > Also tier1, tier2 and tier3 Mach5
jobs succeeded.
> > > > > >
> > > > > > To verify that tests succeed with
test.timeout.factor set to 1.0 the following patch was used before running Mach5 jobs.
> > > > > >
> > > > > > --- a/make/RunTests.gmk Thu Feb 21
15:17:42 2019 -0800
> > > > > > +++ b/make/RunTests.gmk Thu Feb 21
15:42:15 2019 -0800
> > > > > > @@ -826,6 +826,7 @@
> > > > > > else
> > > > > > JTREG_TIMEOUT_FACTOR ?= 4
> > > > > > endif
> > > > > > + JTREG_TIMEOUT_FACTOR = 1
> > > > > > JTREG_VERBOSE ?=
fail,error,summary
> > > > > > JTREG_RETAIN ?= fail,error
> > > > > >
> > > > > > Bug:
https://bugs.openjdk.java.net/browse/JDK-8207367
> > > > > > Webrev:
http://cr.openjdk.java.net/~dtitov/8207367/webrev.01
> > > > > >
> > > > > > Thanks!
> > > > > > --Daniil
> > > > > >
> > > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > >
> > >
> > >
> > >
> > >
> >
> >
> >
> >
> >
>
>
>
>
>
>
>
>
>