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
Wed May 14 18:05:20 UTC 2014


Thanks, Dan!
This test has a good base for what is needed in my case.

Thanks,
Serguei

On 5/14/14 10:52 AM, Daniel D. Daugherty wrote:
> I found an existing test that exercises the add side of the
> house, but haven't found one that exercises the delete side (yet):
>
> $ pwd
> /work/shared/mirrors/src_clones/jdk9/dev_baseline
>
> di$ ls jdk/test/java/lang/instrument/RedefineMethodAddInvoke*
> jdk/test/java/lang/instrument/RedefineMethodAddInvoke.sh
> jdk/test/java/lang/instrument/RedefineMethodAddInvokeAgent.java
> jdk/test/java/lang/instrument/RedefineMethodAddInvokeApp.java
> jdk/test/java/lang/instrument/RedefineMethodAddInvokeTarget.java
> jdk/test/java/lang/instrument/RedefineMethodAddInvokeTarget_1.java
> jdk/test/java/lang/instrument/RedefineMethodAddInvokeTarget_2.java
>
> Dan
>
>
> On 5/14/14 11:30 AM, serguei.spitsyn at oracle.com wrote:
>> Hi Coleen,
>>
>> Thank you for the review and analysis!
>> I'm working on adding a test coverage for this issue.
>>
>> 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