RFR (S) 8042796: jvmtiRedefineClasses.cpp: guarantee(false) failed: OLD and/or OBSOLETE method(s) found

serguei.spitsyn at oracle.com serguei.spitsyn at oracle.com
Thu May 15 17:21:59 UTC 2014


Hi Coleen and Dan,

I've created a j.l.i test covering this issue.
The jdk webrev is:
http://cr.openjdk.java.net/~sspitsyn/webrevs/2014/jdk/8042796-JVMTI-del-tests.1

The updated hotspot webrev is:
http://cr.openjdk.java.net/~sspitsyn/webrevs/2014/hotspot/8042796-JVMTI-del.1

I guess, it is Ok to push the hotspot fix while the test is reviewed?

Thanks,
Serguei


On 5/14/14 9:47 AM, Coleen Phillimore wrote:
>
> Hi Serguei,
>
> On 5/13/14, 8:31 PM, serguei.spitsyn at oracle.com wrote:
>> Coleen,
>>
>>
>> On 5/13/14 4:17 PM, Coleen Phillimore wrote:
>>>
>>> Serguei,
>>>
>>> I don't know if this is the right fix.  We shouldn't have deleted 
>>> methods in the cpCache because there's no way to keep these Method*s 
>>> from being deallocated.  I thought AdjustCpoolCacheAndVtable => 
>>> ConstantPoolCache::adjust_method_entries should fix these entries. 
>>> For deleted methods, shouldn't their cpCache entries be set to 
>>> unresolved?  Which class had the deleted methods? The one being 
>>> redefined?
>>
>> Thank you for reviewing this and for the questions.
>>
>> Let's check if my understanding is right as it is relatively easy to 
>> miss something.
>>
>> The original class has been redefined so that the new version does 
>> not have several private static methods anymore.
>> These methods are called "deleted" but they are still present in the 
>> original version of the class.
>> Even if we set their cpCache entries to unresolved these entries can 
>> be set to resolved again.
>> So that I've decided this approach is not going to work in general case.
>
> Okay, so you answered my question - since the deleted methods are 
> private, they can only be found in the class being redefined's 
> constant pool cache.   Since the class being redefined's cpCache 
> hasn't been deallocated, neither will the Method* that it's pointing 
> to.   Phew!   Thank you for the explanation.
>
>>
>> The interesting question is:
>>  Q: What is going to happen with these entries when the original 
>> version of the class goes away?
>>
>
> Everything will get deallocated, which is fine.
>
>> I'll try to answer this question by looking at the code.
>> It won't be a surprise if there is nothing in place to cover this case.
>>
>>>
>>> It looks like the code never did this.  I think this is missing 
>>> functionality.
>>
>> Yes, that was my guess too.
>>
>>> Do we not have any tests that delete a method?
>>
>> Most likely, we don't.
>>
>>> Your change should add a test anyway - there are class redefinition 
>>> tests in jdk/test/java/lang/instrument that can be adapted and we 
>>> should probably keep them all together there.
>>
>> Right, it is better to have some test coverage here.
>> I'll check if any of the JLI or JDI tests can be extended to cover this.
>> I'm not sure the JLI is good for this task though as deleting the 
>> methods is not instrumentation. :)
>>
>
> So the change looks good pending a test case.  There might be one 
> already but why didn't it fail this assert?  So, we need a test for 
> this case somewhere.
>
> Thanks,
> Coleen
>
>>
>> Thanks!
>> Serguei
>>
>>>
>>> Thanks,
>>> Coleen
>>>
>>> On 5/9/14, 2:20 PM, serguei.spitsyn at oracle.com wrote:
>>>> Please, review the fix for:
>>>>   https://bugs.openjdk.java.net/browse/JDK-8042796
>>>>
>>>>
>>>> Open webrev:
>>>> http://cr.openjdk.java.net/~sspitsyn/webrevs/2014/hotspot/8042796-JVMTI-OLD.1 
>>>>
>>>>
>>>> Summary:
>>>>
>>>>   This is a Nightly Stabilization issue that was caused by a 
>>>> combination of two problems:
>>>>     - A regression introduced by the fix of: 
>>>> https://bugs.openjdk.java.net/browse/JDK-7182152
>>>>     - An SQE testbase infra regression: 
>>>> https://bugs.openjdk.java.net/browse/INTJDK-7611018
>>>>
>>>>   A number of the vm.mlvm tests hits this guarantee taht was added 
>>>> by 7182152 (must be relaxed).
>>>>   The issue is with the deleted static private methods that are 
>>>> still present in the CP cache.
>>>>   The fix is to mark the deleted methods with the flag 
>>>> JVM_ACC_IS_DELETED and
>>>>   then use it to relax the guarantee condition.
>>>>
>>>>
>>>> Testing:
>>>>   Running the failing tests: vm.mlvm.indy.func.jvmti
>>>>   In progress: nsk.jvmti, nsk.jdi, java.lang.instrument test runs 
>>>> on sparcv9 and amd64.
>>>>
>>>>
>>>> Thanks,
>>>> Serguei
>>>
>>
>



More information about the hotspot-dev mailing list