RFR: JDK-8147026- Convert an assert in ClassLoaderData to a guarantee

Shafi Ahmad shafi.s.ahmad at oracle.com
Tue Apr 26 04:50:26 UTC 2016


Thanks for review Coleen.

Regards,
Shafi

-----Original Message-----
From: Coleen Phillimore 
Sent: Tuesday, April 26, 2016 7:34 AM
To: hotspot-runtime-dev at openjdk.java.net
Subject: Re: RFR: JDK-8147026- Convert an assert in ClassLoaderData to a guarantee


I should add that this is Reviewed by me.

Thanks,

Coleen


On 4/25/16 3:09 PM, Coleen Phillimore wrote:
>
> I updated the bug and think there's no harm turning this assert into a 
> guarantee.  If a class_loader is incorrectly unloaded, this might be a 
> useful place to check this.
>
> Coleen
>
> On 2/18/16 9:20 AM, Coleen Phillimore wrote:
>>
>> Hi Shafi,
>>
>> I agree with Ioi, I don't see how this guarantee would have helped 
>> you.  From reading the bug, having some verification in jvm.cpp may 
>> have been more likely to have found your bug, because it's closer to 
>> the source of where you suspected the bug came from. For the record, 
>> I don't think this would hurt performance, which is another concern 
>> with turning some asserts into guarantees.
>>
>> I don't know if I like the idea of turning some asserts into 
>> guarantees with another switch like the -Xlog switches (which I find 
>> so complicated now I need wrapper scripts),
>> https://bugs.openjdk.java.net/browse/JDK-8149478 but we should 
>> discuss on another thread.
>>
>> Coleen
>>
>>
>> On 2/18/16 2:58 AM, Ioi Lam wrote:
>>> Hi Shafi,
>>>
>>> I read the bug report, and it says, " the JVM was crashing during GC 
>>> because the object it was looking at had a pointer to a bad klass.
>>> The core file analysis showed that the classloader object in the 
>>> klass was not a valid Oop". Are you sure that 
>>> ClassLoaderDataGraph::find_or_create was indeed called with an 
>>> invalid loader? There are many reason for this to happen. E.g., 
>>> there could have been strayed memory writes that corrupts the 
>>> pointer to the classloader object.
>>>
>>> In fact, if you have a invalid loader here, the call will return 
>>> junk
>>>
>>> inline ClassLoaderData *ClassLoaderDataGraph::find_or_create(Handle
>>> loader, TRAPS) {
>>>   guarantee(loader() != NULL && loader()->is_oop(), "Loader must be 
>>> oop");
>>>   // Gets the class loader data out of the java/lang/ClassLoader 
>>> object, if non-null
>>>   // it's already in the loader_data, so no need to add
>>>   ClassLoaderData* loader_data=
>>> java_lang_ClassLoader::loader_data(loader());
>>>   if (loader_data) {
>>>      return loader_data;  <<<<<<  junk
>>>   }
>>>
>>> The callers of this code (systemDicrionary.cpp) will deference the 
>>> returned value to do various operations related to class loading, 
>>> and will crash quickly with a bad pointer. It's highly unlikely that 
>>> your original test scenario would have been healthy enough to get to 
>>> the next GC.
>>>
>>> So, I don't think changing the assert to guarantee will 
>>> significantly affect how the product JVM would behave with bad input 
>>> to find_or_create.
>>>
>>> - Ioi
>>>
>>> On 2/16/16 1:51 AM, David Holmes wrote:
>>>> Hi Shafi,
>>>>
>>>> On 16/02/2016 7:41 PM, Shafi Ahmad wrote:
>>>>> Hi All,
>>>>>
>>>>>
>>>>>
>>>>> Please review the trivial change of replacing 'assert' by 'guarantee'
>>>>>
>>>>>
>>>>>
>>>>> Summary: Having a guarantee in method 
>>>>> "ClassLoaderDataGraph::find_or_create" ensuring that the 
>>>>> classloader is a valid oop will help catch the errors at an early 
>>>>> stage during the run rather than crashing the JVM later on in the GC.
>>>>
>>>> I'm not sure I agree with this change on principle. The assert says 
>>>> "we never expect this to fail and we expect to weed out any 
>>>> problems during testing". I could see the need to expand the assert 
>>>> to also check for it being an oop though.
>>>>
>>>> I'll defer approval of this to Coleen and Ioi as they have the 
>>>> expertise in this code area.
>>>>
>>>> Thanks,
>>>> David
>>>>
>>>>>
>>>>>
>>>>> Open webrev: http://cr.openjdk.java.net/~csahu/8147026/webrev.00
>>>>>
>>>>> Bug link: https://bugs.openjdk.java.net/browse/JDK-8147026
>>>>>
>>>>> Testing:  JPRT
>>>>>
>>>>>
>>>>>
>>>>> Since we are changing 'assert' by 'guarantee' which will add few 
>>>>> instruction into code in product build and I am not sure about the
>>>>> *hotness* of this method.
>>>>>
>>>>> So I run the performance test [refworkload] to make sure the 
>>>>> impact of this change in the product build.
>>>>>
>>>>> I am attaching the  performance run report for your reference.
>>>>>
>>>>>
>>>>>
>>>>> Regards,
>>>>>
>>>>> Shafi
>>>>>
>>>>>
>>>>>
>>>
>>
>



More information about the hotspot-runtime-dev mailing list