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 07:59:18 UTC 2020
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