RFR: JDK-8216528: test/jdk/java/rmi/transport/runtimeThreadInheritanceLeak/RuntimeThreadInheritanceLeak.java failing with Xcomp

David Holmes david.holmes at oracle.com
Thu Jan 31 02:59:27 UTC 2019


On 31/01/2019 12:44 pm, Jie Fu wrote:
> Hi David,
> 
> I prefer the original patch[1].
> 
> Could you please sponsor this issue or help me find a sponsor.
> I really appreciate it. Thank you very much.

Hopefully Roger will still sponsor this.

Thanks,
David

> Also thanks Roger. We had a pleasant discussion offlist.
> 
> Best regards,
> Jie
> 
> [1] 
> https://mail.openjdk.java.net/pipermail/core-libs-dev/2019-January/057852.html 
> 
> 
> 
> On 2019/1/31 上午10:09, David Holmes wrote:
>> Hi Jie, Roger,
>>
>> I think this has now consumed far too many cycles for everyone, 
>> dealing with a test that is checking for a leak that can't even exist 
>> any more. Alan was fine with the original proposed patch, as was I, so 
>> I think we can should proceed with that. Obviously there is more than 
>> one way to tackle the Xcomp problem here, and there will always be 
>> issues with any test relying on GC interaction, but the proposed patch 
>> seems "good enough" to me.
>>
>> Cheers,
>> David
>>
>> On 29/01/2019 11:46 am, Jie Fu wrote:
>>> Hi,
>>>
>>> I agree that the simplest way to fix the issue is just adding the 
>>> reachabilityFence.
>>> But this patch might also fail since the VM doesn't guarantee that a 
>>> GC would be performed.
>>>
>>> I didn't make such patch since I've learned from Sergey and Alan that 
>>> calling "System.gc()" several times is unreliable to trigger a gc[1].
>>> So I still prefer the original one[2].
>>>
>>> Thanks a lot.
>>>
>>> Best regards,
>>> Jie
>>>
>>> [1] 
>>> https://mail.openjdk.java.net/pipermail/beans-dev/2019-January/000396.html 
>>>
>>> [2] 
>>> https://mail.openjdk.java.net/pipermail/core-libs-dev/2019-January/057852.html 
>>>
>>>
>>>
>>> On 2019/1/28 下午11:39, Roger Riggs wrote:
>>>> Hi,
>>>>
>>>> The simplest fix for this failing test is to add a call to 
>>>> reachabilityFence to prevent
>>>> the loader and loaderRef from going out of scope early.  It 
>>>> maintains getting debug
>>>> output on a failure.
>>>>
>>>> Offlist, Jie and I explored some alternate ways to write the test 
>>>> and settled on this one.
>>>>
>>>> Please review:
>>>>
>>>> diff --git 
>>>> a/test/jdk/java/rmi/transport/runtimeThreadInheritanceLeak/RuntimeThreadInheritanceLeak.java 
>>>> b/test/jdk/java/rmi/transport/runtimeThreadInheritanceLeak/RuntimeThreadInheritanceLeak.java 
>>>>
>>>> --- 
>>>> a/test/jdk/java/rmi/transport/runtimeThreadInheritanceLeak/RuntimeThreadInheritanceLeak.java 
>>>>
>>>> +++ 
>>>> b/test/jdk/java/rmi/transport/runtimeThreadInheritanceLeak/RuntimeThreadInheritanceLeak.java 
>>>>
>>>> @@ -113,11 +113,13 @@ public class RuntimeThreadInheritanceLea
>>>>              Reference dequeued = refQueue.remove(TIMEOUT);
>>>>              if (dequeued == null) {
>>>>                  System.err.println(
>>>> -                    "TEST FAILED: loader not deteced weakly 
>>>> reachable");
>>>> +                    "TEST FAILED: loader not detected weakly 
>>>> reachable");
>>>>                  dumpThreads();
>>>>                  throw new RuntimeException(
>>>>                      "TEST FAILED: loader not detected weakly 
>>>> reachable");
>>>>              }
>>>> +            Reference.reachabilityFence(loader);
>>>> +            Reference.reachabilityFence(loaderRef);
>>>>
>>>>              System.err.println(
>>>>                  "TEST PASSED: loader detected weakly reachable");
>>>>
>>>> Thanks, Roger
>>>>
>>>>
>>>>
>>>> On 01/11/2019 07:25 PM, Jie Fu wrote:
>>>>> Thanks David and Roger.
>>>>>
>>>>>
>>>>> On 2019年01月12日 06:52, David Holmes wrote:
>>>>>> Hi Roger,
>>>>>>
>>>>>> On 12/01/2019 2:22 am, Roger Riggs wrote:
>>>>>>> Hi,
>>>>>>>
>>>>>>> The proposed patch changes the test in a way that is unintended.
>>>>>>>
>>>>>>> Adding the infinite loop of gc() and sleep, will change the 
>>>>>>> timeout behavior
>>>>>>> from the existing timeout of TIMEOUT to the jtreg default timeout 
>>>>>>> of the whole test.
>>>>>>
>>>>>> Partially true. If the new loop gets stuck then yes the jtreg 
>>>>>> default timeout will apply - I don't see that is necessarily a bad 
>>>>>> thing. The existing timeout only applies to the refQueue.remove 
>>>>>> operation itself, you don't know how much time was spent before 
>>>>>> you got there, nor how much will be spent after in the 
>>>>>> dumpThreads() calls - so the jtreg timeout can still come into 
>>>>>> affect.
>>>>>>
>>>>>>> Further, it renders the check at lines 114-120 irrelevant since 
>>>>>>> loaderRef.get()
>>>>>>> will have returned null and the ref will have been enqueued by then.
>>>>>>
>>>>>> I wouldn't say irrelevant as it double-checks the interaction 
>>>>>> between the ref.get() and the queue.remove() - the result of one 
>>>>>> should imply the result of the other, but if enqueuing had a bug ....
>>>>>>
>>>>>>> While it is true that calling gc() only once is unreliable, a 
>>>>>>> better fix is to
>>>>>>> put the code from 108-120 in a loop with a fixed number of durations
>>>>>>
>>>>>> That would also work - say 5 loops and reduce TIMEOUT to 4000.
>>>>>>
>>>>>>> and add Reachability.reachabilityFence(loaderRef) to ensure the 
>>>>>>> ref is not ignored.
>>>>>>
>>>>>> Adding ReachabilityFence, alone, may solve the observed problem 
>>>>>> given one gc() seems to be working in practice (and because we 
>>>>>> don't actually have the leaked loaders anymore because those 
>>>>>> threads (sun.misc.GC threads) don't exist anymore).
>>>>>>
>>>>>> Cheers,
>>>>>> David
>>>>>>
>>>>>>> Regards, Roger
>>>>>
>>>>>
>>>>
>>>
> 


More information about the core-libs-dev mailing list