[10] RFR: 8185164: GetOwnedMonitorInfo() returns incorrect owned monitor

serguei.spitsyn at oracle.com serguei.spitsyn at oracle.com
Sat Aug 5 11:20:55 UTC 2017


Hi Yasumasa,

Please, merge the converted testcase.
It still might need more tweaks though.

Thanks,
Serguei


On 8/5/17 03:18, Yasumasa Suenaga wrote:
> Hi Serguei,
>
> Thank you so much!
> Should I merge your testcase? Or can you push this change?
>
> I agree to your change as a reviewer.
>
>
> Yasumasa
>
>
> On 2017/08/05 11:34, serguei.spitsyn at oracle.com wrote:
>> The updated patch attached.
>> Now the test is passed with the suggested fix and failed without it.
>>
>> Thanks,
>> Serguei
>>
>>
>> On 8/4/17 15:45, serguei.spitsyn at oracle.com wrote:
>>> On 8/4/17 14:26, Daniel D. Daugherty wrote:
>>>> On 8/4/17 3:17 PM, serguei.spitsyn at oracle.com wrote:
>>>>> The patch is attached.
>>>>> It may need some tweaks though.
>>>>> I was not able to make it fail yet.
>>>>
>>>> I don't think the original test had "failure" detection.
>>>> You were just supposed to notice that a pending monitor
>>>> was listed under the wrong list.
>>> Nothing is listed.
>>> Strange thing is I do not see the monitor events fired.
>>> I'm using 10 for testing.
>>>
>>> Thanks,
>>> Serguei
>>>
>>>>
>>>> Dan
>>>>
>>>>
>>>>>
>>>>>
>>>>> On 8/4/17 12:45, Daniel D. Daugherty wrote:
>>>>>> Thanks Serguei!
>>>>>>
>>>>>> I happen to be doing a test run this weekend that includes most 
>>>>>> of the
>>>>>> JPDA stack of tests so I'll include the following in my experiment:
>>>>>>
>>>>>> $ hg log -v -r tip
>>>>>> changeset:   12872:bb66cd7c61b1
>>>>>> tag:         8185164.patch
>>>>>> tag:         qtip
>>>>>> tag:         tip
>>>>>> user:        dcubed
>>>>>> date:        Fri Aug 04 13:41:29 2017 -0600
>>>>>> files:       src/share/vm/runtime/objectMonitor.cpp
>>>>>> description:
>>>>>> imported patch 8185164.patch
>>>>>>
>>>>>>
>>>>>> That will get the product code changes a complete round of testing
>>>>>> on Solaris X64 at least... :-)
>>>>>
>>>>> Great!
>>>>>
>>>>> Thanks,
>>>>> Serguei
>>>>>>
>>>>>> Dan
>>>>>>
>>>>>>
>>>>>> On 8/4/17 1:31 PM, serguei.spitsyn at oracle.com wrote:
>>>>>>> Dan,
>>>>>>>
>>>>>>> Thank you for letting me know about this discussion.
>>>>>>> I'll try to convert the attached test case to the JTreg format.
>>>>>>>
>>>>>>> Thanks,
>>>>>>> Serguei
>>>>>>>
>>>>>>>
>>>>>>> On 8/4/17 11:16, Daniel D. Daugherty wrote:
>>>>>>>> Adding Serguei to this thread directly since he's back from 
>>>>>>>> vacation!
>>>>>>>>
>>>>>>>>
>>>>>>>> On 7/31/17 10:14 PM, David Holmes wrote:
>>>>>>>>> Hi Dan,
>>>>>>>>>
>>>>>>>>> On 26/07/2017 11:52 PM, Daniel D. Daugherty wrote:
>>>>>>>>>> On 7/26/17 12:11 AM, David Holmes wrote:
>>>>>>>>>>> On 26/07/2017 10:27 AM, Yasumasa Suenaga wrote:
>>>>>>>>>>>> Hi Dan,
>>>>>>>>>>>>
>>>>>>>>>>>>> I've added some analysis to the bug report
>>>>>>>>>>>>
>>>>>>>>>>>> Thanks!
>>>>>>>>>>>> I tried to fix this issue in 
>>>>>>>>>>>> JvmtiEnvBase::get_owned_monitors() at first.
>>>>>>>>>>>> But it is difficult because we cannot know pending monitor 
>>>>>>>>>>>> if thread state is MONITOR_CONTENDED_ENTER when 
>>>>>>>>>>>> get_owned_monitor() is called.
>>>>>>>>>>>
>>>>>>>>>>> I need to look closer at this when I get back from vacation 
>>>>>>>>>>> next week.
>>>>>>>>>>
>>>>>>>>>> Seems like you're back already. :-)
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>> A pending monitor should not be reported as owned (unless 
>>>>>>>>>>> the spec says otherwise) and it seems odd to me to fix the 
>>>>>>>>>>> current problem by marking the monitor as pending earlier.
>>>>>>>>>>
>>>>>>>>>> It's the updating of the _current_pending_monitor field that
>>>>>>>>>> allows JvmtiEnvBase::get_locked_objects_in_frame() to recognize
>>>>>>>>>> that the monitor observed in the frame is only pending and
>>>>>>>>>> is not owned.
>>>>>>>>>>
>>>>>>>>>> I put a fairly detailed note in the bug yesterday, but you
>>>>>>>>>> should look at that when you're officially back!
>>>>>>>>>
>>>>>>>>> Thanks for clarifying things. I also added a comment to the 
>>>>>>>>> bug report.
>>>>>>>>>
>>>>>>>>> I think the fix is sound and prevents anyone from observing 
>>>>>>>>> the case where the monitor will be seen in the stack-frame, 
>>>>>>>>> but has not yet been set as the "pending monitor". As far as I 
>>>>>>>>> can tell it is only this case (GetOwnedMonitorInfo from the 
>>>>>>>>> contended-monitor event callback in the current thread) that 
>>>>>>>>> will be able to observe the change.
>>>>>>>>
>>>>>>>> One scenario that I worry about here is that a 
>>>>>>>> GetCurrentContendedMonitor()
>>>>>>>> call on a target thread will now be able to return a non-NULL 
>>>>>>>> value for the
>>>>>>>> object, when GetThreadState() will be able to return something 
>>>>>>>> other than
>>>>>>>> blocked (on monitor enter) for the thread.
>>>>>>>>
>>>>>>>> I don't see anything in the JVM/TI spec that says such a 
>>>>>>>> scenario is
>>>>>>>> wrong; I'm only worried about whether we have any tests that 
>>>>>>>> would catch
>>>>>>>> this slight change in behavior. In any case, one of these 
>>>>>>>> operations has
>>>>>>>> to "happen first":
>>>>>>>>
>>>>>>>>   - thread is marked as blocked
>>>>>>>>   - monitor is flagged as contended
>>>>>>>>
>>>>>>>> Currently, they happen in the above order and the fix proposes to
>>>>>>>> change the order and I see no reason not to do it.
>>>>>>>>
>>>>>>>> I would like the test attached to the bug to be converted into 
>>>>>>>> a native
>>>>>>>> JTREG test that lives in hotspot/test/serviceability/jvmti. See 
>>>>>>>> the
>>>>>>>> following test as a possible example:
>>>>>>>>
>>>>>>>>    hotspot/test/serviceability/jvmti/GetNamedModule
>>>>>>>>
>>>>>>>> for how to do this... I haven't done one of these new native JTREG
>>>>>>>> tests myself, but I believe Serguei has...
>>>>>>>>
>>>>>>>> Dan
>>>>>>>>
>>>>>>>>
>>>>>>>>>
>>>>>>>>> Thanks,
>>>>>>>>> David
>>>>>>>>>
>>>>>>>>>> Dan
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Thanks,
>>>>>>>>>>> David
>>>>>>>>>>>
>>>>>>>>>>>>> Did you run the jdk repo's com/sun/jdi tests with your fix?
>>>>>>>>>>>>
>>>>>>>>>>>> I have not done yet.
>>>>>>>>>>>> I have a trip until 28 July JST. So I will run it after that.
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> Yasumasa
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> On 2017/07/26 7:05, Daniel D. Daugherty wrote:
>>>>>>>>>>>>> On 7/24/17 8:40 PM, Yasumasa Suenaga wrote:
>>>>>>>>>>>>>> Hi all,
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> I tried to get owned monitors in MonitorContendedEnter 
>>>>>>>>>>>>>> JVMTI event handler.
>>>>>>>>>>>>>> However GetOwnedMonitorInfo JVMTI function returns a 
>>>>>>>>>>>>>> monitor which is
>>>>>>>>>>>>>> not yet owned.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> I attached reproducer to JBS. Please read README.md.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> I think GetOwnedMonitorInfo() should not return a pending 
>>>>>>>>>>>>>> monitor.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> I uploaded webrev. Could you review?
>>>>>>>>>>>>>> http://cr.openjdk.java.net/~ysuenaga/JDK-8185164/webrev.00/
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> I hope this fix is applied to 8u or later release.
>>>>>>>>>>>>>> I cannot access JPRT. So I need a sponsor.
>>>>>>>>>>>>>
>>>>>>>>>>>>> Thanks for the bug report. It's nice to have a test case 
>>>>>>>>>>>>> and a proposed
>>>>>>>>>>>>> fix all in the bug report! I've added some analysis to the 
>>>>>>>>>>>>> bug report
>>>>>>>>>>>>> and we'll need to run this fix through Oracle's JPDA test 
>>>>>>>>>>>>> stack which
>>>>>>>>>>>>> is not (yet) open.
>>>>>>>>>>>>>
>>>>>>>>>>>>> Did you run the jdk repo's com/sun/jdi tests with your fix?
>>>>>>>>>>>>>
>>>>>>>>>>>>> Dan
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Yasumasa
>>>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>



More information about the serviceability-dev mailing list