RFR: 8277444: Data race between JvmtiClassFileReconstituter::copy_bytecodes and class linking [v5]

David Holmes dholmes at openjdk.org
Thu Sep 4 00:57:48 UTC 2025


On Tue, 2 Sep 2025 21:45:03 GMT, Evgeny Astigeevich <eastigeevich at openjdk.org> wrote:

>> There is a race between `JvmtiClassFileReconstituter::copy_bytecodes` and `InstanceKlass::link_class_impl`.  `InstanceKlass::link_class_impl` can be rewriting bytecodes. `JvmtiClassFileReconstituter::copy_bytecodes` will not restore them to the original ones because the flag `rewritten` is `false`. This will result in invalid bytecode.
>> 
>> This PR adds linking a class before the `copy_bytecodes` method is called.
>> The PR also adds a regression test.
>> 
>> Tested fastdebug and release builds: Linux x86_64 and arm64
>> - The reproducer from JDK-8277444 passed.
>> - The regression test passed.
>> - Tier1 - tier3 passed.
>
> Evgeny Astigeevich has updated the pull request incrementally with one additional commit since the last revision:
> 
>   Switch to macros HAS_PENDING_EXCEPTION, CLEAR_PENDING_EXCEPTION

Generally looks good. There are a few minor nits/typos.

I'm not sure about the test, in particular the attempt to calculate `MIN_LINK_TIME_MS`. It is very hard to see/know that you will actually induce the desired race. But as the test doesn't actually have any explicit failure conditions, it at least won't generate false reports.

Thanks

src/hotspot/share/prims/jvmtiEnv.cpp line 454:

> 452:     if (ik->get_cached_class_file_bytes() == nullptr) {
> 453:       // Link the class to avoid races with the rewriter. This will call the verifier also
> 454:       // on the class. Linking is done already below in VM_RedefineClasses below, but we need

Suggestion:

      // on the class. Linking is also done in VM_RedefineClasses below, but we need

There are two "below"s

test/jdk/java/lang/instrument/RetransformBigClassTest.java line 44:

> 42:  * in another thread. The test uses Class.forName("BigClass", false, classLoader)
> 43:  * which does not link the class. When the class is used, the linking process starts.
> 44:  * In another thread retransforming of the class is happening,

Suggestion:

 * In another thread retransforming of the class is happening.

test/jdk/java/lang/instrument/RetransformBigClassTest.java line 45:

> 43:  * which does not link the class. When the class is used, the linking process starts.
> 44:  * In another thread retransforming of the class is happening,
> 45:  * We generate a class with big methods. A number of methods and thier size are

Suggestion:

 * We generate a class with big methods. A number of methods and their size are

test/jdk/java/lang/instrument/RetransformBigClassTest.java line 46:

> 44:  * In another thread retransforming of the class is happening,
> 45:  * We generate a class with big methods. A number of methods and thier size are
> 46:  * chosen to make the linking and retransforming processes running concurrently.

Suggestion:

 * chosen to make the linking and retransforming processes run concurrently.

test/jdk/java/lang/instrument/RetransformBigClassTest.java line 54:

> 52:     private static final Object LOCK = new Object();
> 53:     private static final int COUNTER_INC_COUNT            = 2000; // A number of 'c+=1;' statements in methods of a class.
> 54:     private static final int MIN_LINK_TIME_MS             = 60;   // This time is chosen to be big enough the linking and retransforming processes are running in parallel.

Suggestion:

    private static final int MIN_LINK_TIME_MS             = 60;   // Large enough so linking and retransforming run in parallel.

test/jdk/java/lang/instrument/RetransformBigClassTest.java line 108:

> 106:     }
> 107: 
> 108:     // We calculate a number of methods the linking time to exceed MIN_LINK_TIME_MS.

I can't quite parse this sentence.

-------------

PR Review: https://git.openjdk.org/jdk/pull/26863#pullrequestreview-3182975103
PR Review Comment: https://git.openjdk.org/jdk/pull/26863#discussion_r2320540581
PR Review Comment: https://git.openjdk.org/jdk/pull/26863#discussion_r2320542950
PR Review Comment: https://git.openjdk.org/jdk/pull/26863#discussion_r2320543345
PR Review Comment: https://git.openjdk.org/jdk/pull/26863#discussion_r2320543595
PR Review Comment: https://git.openjdk.org/jdk/pull/26863#discussion_r2320544630
PR Review Comment: https://git.openjdk.org/jdk/pull/26863#discussion_r2320546835


More information about the hotspot-dev mailing list