RFR(XS): 8245126 Kitchensink fails with: assert(!method->is_old()) failed: Should not be installing old methods

Dean Long dean.long at oracle.com
Thu May 28 17:54:56 UTC 2020


Sure, you could just have cache_jvmti_state() return a boolean to bail 
out immediately for is_old.

dl

On 5/28/20 7:23 AM, serguei.spitsyn at oracle.com wrote:
> Hi Dean,
>
> Thank you for looking at this!
> Okay. Let me check what cab be done in this direction.
> There is no point to cache is_old. The compilation has to bail out if 
> it is discovered to be true.
>
> Thanks,
> Serguei
>
>
> On 5/28/20 00:59, Dean Long wrote:
>> This seems OK as long as the memory barriers in the thread state 
>> transitions prevent the C++ compiler from doing something like 
>> reading is_old before reading redefinition_count.  I would feel 
>> better if both JVMCI and C1/C2 cached is_old and redefinition_count 
>> at the same time (making sure to be in the _thread_in_vm state), then 
>> bail out based on the cached value of is_old.
>>
>> dl
>>
>> On 5/26/20 12:04 AM, serguei.spitsyn at oracle.com wrote:
>>> On 5/25/20 23:39, serguei.spitsyn at oracle.com wrote:
>>>> Please, review a fix for:
>>>> https://bugs.openjdk.java.net/browse/JDK-8245126
>>>>
>>>> Webrev:
>>>> http://cr.openjdk.java.net/~sspitsyn/webrevs/2020/kitchensink-comp.1/
>>>>
>>>>
>>>> Summary:
>>>>   The Kitchensink stress test with the Instrumentation module 
>>>> enabled does
>>>>   a lot of class retransformations in parallel with all other 
>>>> stressing.
>>>>   It provokes the assert at the compiled code installation time:
>>>>     assert(!method->is_old()) failed: Should not be installing old 
>>>> methods
>>>>
>>>>   The problem is that the CompileBroker::invoke_compiler_on_method 
>>>> in C2 version
>>>>   (non-JVMCI tiered compilation) is missing the check that exists 
>>>> in the JVMCI
>>>>   part of implementation:
>>>> 2148     // Skip redefined methods
>>>> 2149     if (target_handle->is_old()) {
>>>> 2150       failure_reason = "redefined method";
>>>> 2151       retry_message = "not retryable";
>>>> 2152       compilable = ciEnv::MethodCompilable_never;
>>>> 2153     } else {
>>>> . . .
>>>> 2168     }
>>>>
>>>>    The fix is to add this check.
>>>
>>> Sorry, forgot to explain one thing.
>>> Compiler code has a special mechanism to ensure the JVMTI class 
>>> redefinition did
>>> not happen while the method was compiled, so all the assumptions 
>>> remain correct.
>>>    2190     // Cache Jvmti state
>>>    2191     ci_env.cache_jvmti_state();
>>> Part of this is a check that the value of 
>>> JvmtiExport::redefinition_count() is
>>> cached in ciEnv variable: _jvmti_redefinition_count.
>>> The JvmtiExport::redefinition_count() value change means a class 
>>> redefinition
>>> happened which also implies some of methods may become old.
>>> However, the method being compiled can be already old at the point 
>>> where the
>>> redefinition counter is cached, so the redefinition counter check 
>>> does not help much.
>>>
>>> Thanks,
>>> Serguei
>>>
>>>> Testing:
>>>>    Ran Kitchensink test with the Instrumentation module enabled in mach5
>>>>    multiple times for 100 times. Without the fix the test normally fails
>>>>    a couple of times in 200 runs. It does not fail with the fix anymore.
>>>>    Will also submit hs tiers1-5.
>>>>
>>>> Thanks,
>>>> Serguei
>>>
>>
>



More information about the hotspot-compiler-dev mailing list