RFR JDK-8170089: nsk/jdi/EventSet/resume/resume008: ERROR: suspendCounts don't match for : Common-Cleaner

Chris Plummer chris.plummer at oracle.com
Fri Aug 3 22:38:27 UTC 2018


Hi Gary,

Overall it looks good.

Is the EventHandler.isDisconnected() check needed?

In resume008a.java you removed a lot of empty lines. In some places it's 
fine, but the lines at 132 and 134 should have remained. Also, for the 
ones that were ok to remove, I don't see you doing the same thing in the 
other files. I think probably it's best to be consistent, and for this 
webrev probably best not to do them since it distracts too much from the 
important changes.

Seems like there is a lot of abstraction that could have been done with 
these tests to share a lot of code, but since so far that hasn't been 
done, probably not a good idea to start doing that with this fix. Do you 
think it's worth filing an enhancement request for?

thanks,

Chris

On 8/3/18 11:04 AM, Gary Adams wrote:
> Here is an updated webrev with the alternate solution implemented for
> resume 1 to 10. The debugger sets testCase variable in the debuggee
> when each test case completes in the debugger. By having the debuggee
> wait for the debugger to complete with test case 0, it avoids the 
> interference
> that occurs by proceeding to the breakpoint set in MethodForCommunication
> before the debugger has compared expected suspend counts.
>
>   Webrev: http://cr.openjdk.java.net/~gadams/8170089/webrev.01/index.html
>
> On 7/17/18, 11:33 AM, Gary Adams wrote:
>> A race condition exists between the debugger and the debuggee.
>>
>> The first test thread is started with SUSPEND_NONE policy set.
>> While processing the thread start event the debugger captures
>> an initial set of thread suspend counts and resumes the
>> debuggee vm. If the debuggee advances quickly it reaches
>> the breakpoint set for methodForCommunication. Since the breakpoint
>> carries with it SUSPEND_ALL policy, when the debugger captures a second
>> set of suspend counts, it will not match the expected counts for
>> a SUSPEND_NONE scenario.
>>
>> The proposed fix introduces a yield in the debuggee test thread run 
>> method
>> to allow the debugger to get the expected sampled values.
>>
>>   Issue: https://bugs.openjdk.java.net/browse/JDK-8170089
>>   Webrev: http://cr.openjdk.java.net/~gadams/8170089/webrev.00/
>>
>>
>> test/hotspot/jtreg/vmTestbase/nsk/share/jdi/TestDebuggerType1.java:
>> ...
>>    186        private void setCommunicationBreakpoint(ReferenceType 
>> refType, String methodName) {
>>    187            Method method = debuggee.methodByName(refType, 
>> methodName);
>>    188            Location location = null;
>>    189            try {
>>    190                location = method.allLineLocations().get(0);
>>    191            } catch (AbsentInformationException e) {
>>    192                throw new Failure(e);
>>    193            }
>>    194            bpRequest = debuggee.makeBreakpoint(location);
>>    195
>>
>>    196 bpRequest.setSuspendPolicy(EventRequest.SUSPEND_ALL);
>>
>>    197            bpRequest.putProperty("number", "zero");
>>    198            bpRequest.enable();
>>    199
>>    200            eventHandler.addListener(
>>    201                 new EventHandler.EventListener() {
>>    202                     public boolean eventReceived(Event event) {
>>    203                        if (event instanceof BreakpointEvent && 
>> bpRequest.equals(event.request())) {
>>    204                            synchronized(eventHandler) {
>>    205                                display("Received communication 
>> breakpoint event.");
>>    206                                bpCount++;
>>    207                                eventHandler.notifyAll();
>>    208                            }
>>    209                            return true;
>>    210                        }
>>    211                        return false;
>>    212                     }
>>    213                 }
>>    214            );
>>    215        }
>>
>>
>> test/hotspot/jtreg/vmTestbase/nsk/jdi/EventSet/resume/resume008.java:
>> ...
>>    140                    display("......--> vm.suspend();");
>>    141                    vm.suspend();
>>    142
>>    143                    display("        getting : Map<String, 
>> Integer> suspendsCounts1");
>>    144
>>    145                    Map<String, Integer> suspendsCounts1 = new 
>> HashMap<String, Integer>();
>>    146                    for (ThreadReference threadReference : 
>> vm.allThreads()) {
>>    147 suspendsCounts1.put(threadReference.name(), 
>> threadReference.suspendCount());
>>    148                    }
>>    149                    display(suspendsCounts1.toString());
>>    150
>>    151                    display("        eventSet.resume;");
>>    152                    eventSet.resume();
>>    153
>>    154                    display("        getting : Map<String, 
>> Integer> suspendsCounts2");
>>
>> This is where the breakpoint is encountered before the second set of 
>> suspend counts is acquired.
>>
>>    155                    Map<String, Integer> suspendsCounts2 = new 
>> HashMap<String, Integer>();
>>    156                    for (ThreadReference threadReference : 
>> vm.allThreads()) {
>>    157 suspendsCounts2.put(threadReference.name(), 
>> threadReference.suspendCount());
>>    158                    }
>>    159                    display(suspendsCounts2.toString());
>>
>



More information about the serviceability-dev mailing list