RFR(s) 8153711: [REDO] JDWP: Memory Leak: GlobalRefs never deleted when processing invokeMethod command
serguei.spitsyn at oracle.com
serguei.spitsyn at oracle.com
Wed Apr 20 02:06:47 UTC 2016
On 4/19/16 02:22, serguei.spitsyn at oracle.com wrote:
> On 4/19/16 02:16, Severin Gehwolf wrote:
>> Hi,
>>
>> On Tue, 2016-04-19 at 01:33 -0700, serguei.spitsyn at oracle.com wrote:
>>> Hi Severin,
>>>
>>> Please, find my comments below.
>>>
>>> On 4/15/16 13:52, serguei.spitsyn at oracle.com wrote:
>>>> On 4/15/16 11:59, Dmitry Samersoff wrote:
>>>>> Severin,
>>>>>
>>>>> Looks good for me.
>>>>>
>>>>> But I'm a little afraid of the fact that now we are holding
>>>>> eventHandler_lock while doing invoke*.
>>>> It seems, I have this concern too.
>>>> Please, let me take a look closer at this part if it is done in a
>>>> right way.
>>> Ok, my question was not about the eventHandler_lock, but about the
>>> invokerLock. Please, see below.
>>>
>>>>
>>>>> So please hold on with backports until the fix bakes in jdk9 for
>>>>> some time.
>>>> +1
>>>> Thanks,
>>>> Serguei
>>>>
>>>>> -Dmitry
>>>>>
>>>>> On 2016-04-15 19:53, Severin Gehwolf wrote:
>>>>>> Hi,
>>>>>>
>>>>>> Here is a patch which is a redo of the fix for JDK-4858370 which got
>>>>>> backed out due to it causing test regressions. Specifically problems
>>>>>> were reported for com/sun/jdi/InvokeTest.java
>>>>>> and com/sun/jdi/InterfaceMethodsTest.java with the fix for
>>>>>> JDK-4858370
>>>>>> applied.
>>>>>>
>>>>>> Those test regressions were caused because:
>>>>>> a.) The fix for JDK-4858370 deleted refs from the request object
>>>>>> while *not* holding the invoker lock.
>>>>>> b.) Invokes done via invoker_doInvoke() save global references, but
>>>>>> don't hold the invoker lock either.
>>> It seems, the invokerLock is to protect any uses of the 'request'
>>> pointer that points
>>> to the field ThreadNode.currentInvoke, not to protect the
>>> saveGlobalRef() call itself.
>>> So that, we have a hole in synchronization that you nicely discovered.
>> Yes, that's right. saveGlobalRef() saves references by using the
>> request pointer.
>>
>>> Here is a couple of more places where the 'request' pointer is not
>>> protected with
>>> the invokerLock:
>>> invoker_enableInvokeRequests(), invoker_isPending(),
>>> invoker_isEnabled().
>>>
>>> I've filed a new bug:
>>> https://bugs.openjdk.java.net/browse/JDK-8154529
>>>
>>> BTW, these are pretty simple or rare cases that do not harm much.
>>> The function invoker_isPending() is not used at all.
>> OK.
>>
>>> Please, consider your fix reviewed.
>> Thanks!
>>
>> The hg exported changeset is here:
>> http://cr.openjdk.java.net/~sgehwolf/webrevs/JDK-8153711/JDK-8153711-jdk9-jdk.export.patch
>>
>>
>> I'd need somebody to sponsor this for me.
>
> I will sponsor the fix for you.
Hi Severin,
I postpone a push for this fix.
There are two nsk.jdi test failures (they look like deadlocks):
nsk/jdi/ObjectReference/invokeMethod/invokemethod012 FAIL(TIMEOUT)
nsk/jdi/Scenarios/invokeMethod/popframes001 FAIL(TIMEOUT)
and one jtreg sun/com/jdi failure (it looks like a deadlock too):
com/sun/jdi/InvokeHangTes.java
I'll double check if these failures are regressions caused by your fix
or not.
Thanks,
Serguei
>
> Thanks,
> Serguei
>
>>
>> Cheers,
>> Severin
>>
>>> Thanks!
>>> Serguei
>>>
>>>
>>>>>> This new fix grabs relevant locks for both cases above.
>>>>>>
>>>>>> Testing done:
>>>>>> - com/sun/jdi test set. No regressions + added regression test.
>>>>>> - com/sun/jdi/InterfaceMethodsTest.java did not fail in 1300
>>>>>> invocations. Same for com/sun/jdi/InvokeTest.java.
>>>>>> - I haven't seen any crashes in new OomDebugTest.java either.
>>>>>>
>>>>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8153711
>>>>>> webrev:
>>>>>> http://cr.openjdk.java.net/~sgehwolf/webrevs/JDK-8153711/webrev.01/
>>>>>>
>>>>>> Once reviewed, I'd need somebody to sponsor this patch.
>>>>>>
>>>>>> Thanks,
>>>>>> Severin
>>>>>>
>>
>
More information about the serviceability-dev
mailing list