The following tests have failed in the loom repo when run with -Duse.JTREG_TEST_THREAD_FACTORY=Virtual:
vmTestbase/nsk/jvmti/SetFieldModificationWatch/setfmodw001/TestDescription.java
vmTestbase/nsk/jvmti/SetFieldAccessWatch/setfldw001/TestDescription.java
#
# A fatal error has been detected by the Java Runtime Environment:
#
# Internal Error (open/src/hotspot/share/prims/jvmtiEventController.cpp:221), pid=3366357, tid=3366473
# assert(state->get_thread() == jt) failed: handshake unsafe conditions
#
# JRE version: Java(TM) SE Runtime Environment (24.0+3) (fastdebug build 24-loom+3-25)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (fastdebug 24-loom+3-25, mixed mode, sharing, tiered, compressed class ptrs, z gc, linux-amd64)
--------------- T H R E A D ---------------
Current thread (0x00007f476c3549a0): JavaThread "ForkJoinPool-1-worker-1" daemon [_thread_in_vm, id=3366473, stack(0x00007f453cf7c000,0x00007f453d07c000) (1024K)]
Stack: [0x00007f453cf7c000,0x00007f453d07c000], sp=0x00007f453d078760, free space=1009k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
V [libjvm.so+0x119cb10] EnterInterpOnlyModeClosure::do_thread(Thread*)+0x150 (jvmtiEventController.cpp:221)
V [libjvm.so+0xdad2b7] HandshakeOperation::do_handshake(JavaThread*)+0x47 (handshake.cpp:326)
V [libjvm.so+0xdad4e1] HandshakeState::process_by_self(bool, bool)+0x141 (handshake.cpp:577)
V [libjvm.so+0x1614955] SafepointMechanism::process(JavaThread*, bool, bool)+0x65 (safepointMechanism.cpp:159)
V [libjvm.so+0x7f7e81] ThreadInVMfromJava::~ThreadInVMfromJava()+0x161 (safepointMechanism.inline.hpp:83)
V [libjvm.so+0xe5e521] InterpreterRuntime::monitorenter_obj(JavaThread*, oopDesc*)+0x111 (interpreterRuntime.cpp:760)
j nsk.jvmti.SetFieldModificationWatch.setfmodw001.run([Ljava/lang/String;Ljava/io/PrintStream;)I+37
j nsk.jvmti.SetFieldModificationWatch.setfmodw001.main([Ljava/lang/String;)V+9
j java.lang.invoke.LambdaForm$DMH+0x00007f44cf003800.invokeStatic(Ljava/lang/Object;Ljava/lang/Object;)V+10 java.base@24-loom
j java.lang.invoke.LambdaForm$MH+0x00007f44cf004c00.invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;+33 java.base@24-loom
j java.lang.invoke.Invokers$Holder.invokeExact_MT(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;+20 java.base@24-loom
j jdk.internal.reflect.DirectMethodHandleAccessor.invokeImpl(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;+55 java.base@24-loom
j jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;+23 java.base@24-loom
j java.lang.reflect.Method.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;+102 java.base@24-loom
j com.sun.javatest.regtest.agent.MainWrapper$MainTask.run()V+134
j java.lang.Thread.runWith(Ljava/lang/Object;Ljava/lang/Runnable;)V+5 java.base@24-loom
j java.lang.VirtualThread.run(Ljava/lang/Runnable;)V+66 java.base@24-loom
j java.lang.VirtualThread$VThreadContinuation$1.run()V+8 java.base@24-loom
j jdk.internal.vm.Continuation.enter0()V+4 java.base@24-loom
j jdk.internal.vm.Continuation.enter(Ljdk/internal/vm/Continuation;Z)V+1 java.base@24-loom
J 62 jdk.internal.vm.Continuation.enterSpecial(Ljdk/internal/vm/Continuation;ZZ)V java.base@24-loom (0 bytes) @ 0x00007f475c2f2c24 [0x00007f475c2f2ac0+0x0000000000000164]
j jdk.internal.vm.Continuation.run()V+122 java.base@24-loom
j java.lang.VirtualThread.runContinuation()V+78 java.base@24-loom
j java.lang.VirtualThread$$Lambda+0x00007f44cf04e3e0.run()V+4 java.base@24-loom
j java.util.concurrent.ForkJoinTask$RunnableExecuteAction.compute()Ljava/lang/Void;+4 java.base@24-loom
j java.util.concurrent.ForkJoinTask$RunnableExecuteAction.compute()Ljava/lang/Object;+1 java.base@24-loom
j java.util.concurrent.ForkJoinTask$InterruptibleTask.exec()Z+51 java.base@24-loom
j java.util.concurrent.ForkJoinTask.doExec()V+10 java.base@24-loom
j java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(Ljava/util/concurrent/ForkJoinTask;I)V+9 java.base@24-loom
j java.util.concurrent.ForkJoinPool.runWorker(Ljava/util/concurrent/ForkJoinPool$WorkQueue;)V+366 java.base@24-loom
j java.util.concurrent.ForkJoinWorkerThread.run()V+31 java.base@24-loom
v ~StubRoutines::call_stub 0x00007f475bd5fcfa
V [libjvm.so+0xe7fd19] JavaCalls::call_helper(JavaValue*, methodHandle const&, JavaCallArguments*, JavaThread*)+0x4a9 (javaCalls.cpp:415)
V [libjvm.so+0xe803ac] JavaCalls::call_virtual(JavaValue*, Klass*, Symbol*, Symbol*, JavaCallArguments*, JavaThread*)+0x34c (javaCalls.cpp:329)
V [libjvm.so+0xe805c6] JavaCalls::call_virtual(JavaValue*, Handle, Klass*, Symbol*, Symbol*, JavaThread*)+0x76 (javaCalls.cpp:191)
V [libjvm.so+0xff1153] thread_entry(JavaThread*, JavaThread*)+0x93 (jvm.cpp:2949)
V [libjvm.so+0xeb8e4c] JavaThread::thread_main_inner()+0xcc (javaThread.cpp:772)
V [libjvm.so+0x17e1026] Thread::call_run()+0xb6 (thread.cpp:225)
V [libjvm.so+0x14c7297] thread_native_entry(Thread*)+0x127 (os_linux.cpp:858)
Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
J 62 jdk.internal.vm.Continuation.enterSpecial(Ljdk/internal/vm/Continuation;ZZ)V java.base@24-loom (0 bytes) @ 0x00007f475c2f2c33 [0x00007f475c2f2ac0+0x0000000000000173]
j jdk.internal.vm.Continuation.run()V+122 java.base@24-loom
j java.lang.VirtualThread.runContinuation()V+78 java.base@24-loom
j java.lang.VirtualThread$$Lambda+0x00007f44cf04e3e0.run()V+4 java.base@24-loom
j java.util.concurrent.ForkJoinTask$RunnableExecuteAction.compute()Ljava/lang/Void;+4 java.base@24-loom
j java.util.concurrent.ForkJoinTask$RunnableExecuteAction.compute()Ljava/lang/Object;+1 java.base@24-loom
j java.util.concurrent.ForkJoinTask$InterruptibleTask.exec()Z+51 java.base@24-loom
j java.util.concurrent.ForkJoinTask.doExec()V+10 java.base@24-loom
j java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(Ljava/util/concurrent/ForkJoinTask;I)V+9 java.base@24-loom
j java.util.concurrent.ForkJoinPool.runWorker(Ljava/util/concurrent/ForkJoinPool$WorkQueue;)V+366 java.base@24-loom
j java.util.concurrent.ForkJoinWorkerThread.run()V+31 java.base@24-loom
v ~StubRoutines::call_stub 0x00007f475bd5fcfa
JavaThread requesting switch to interpreter only mode:
"Thread-0" #36 daemon prio=5 tid=0x00007f44980100a0 nid=3366476 runnable [0x00007f453cf79000]
java.lang.Thread.State: RUNNABLE
JavaThread state: _thread_blocked
0x00007f4773cfc1d0 __GI___nanosleep + 0x40
0x00007f4772c667fb os::naked_short_sleep(long) + 0x4b
0x00007f477253f4ba Handshake::execute(HandshakeClosure*, ThreadsListHandle*, JavaThread*) + 0x94a
0x00007f4772929921 JvmtiEventControllerPrivate::enter_interp_only_mode(JvmtiThreadState*) + 0xa1
0x00007f4772929c00 JvmtiEventControllerPrivate::recompute_thread_enabled(JvmtiThreadState*) [clone .part.0] + 0x190
0x00007f477292ac48 JvmtiEventControllerPrivate::recompute_enabled() + 0x188
0x00007f477292d305 JvmtiEventController::change_field_watch(jvmtiEvent, bool) + 0xd5
0x00007f477290eaa6 JvmtiEnv::SetFieldModificationWatch(fieldDescriptor*) + 0x56
0x00007f47728b4cc3 jvmti_SetFieldModificationWatch + 0x343
0x00007f47743ecd9e setWatch + 0x4e
Problem seems to be that JVMTI Watched Field functions doesn’t disable transitions, so in recompute_enabled() we could see that a vthread is mounted, but in the EnterInterpOnlyModeClosure handshake the thread could have been unmounted already.
I think the only reason why we are not seeing this on mainline is because the test uses synchronize which currently doesn’t unmount. But if we were to use some j.u.c I think we would have the same issue.
vmTestbase/nsk/jvmti/SetFieldModificationWatch/setfmodw001/TestDescription.java
vmTestbase/nsk/jvmti/SetFieldAccessWatch/setfldw001/TestDescription.java
#
# A fatal error has been detected by the Java Runtime Environment:
#
# Internal Error (open/src/hotspot/share/prims/jvmtiEventController.cpp:221), pid=3366357, tid=3366473
# assert(state->get_thread() == jt) failed: handshake unsafe conditions
#
# JRE version: Java(TM) SE Runtime Environment (24.0+3) (fastdebug build 24-loom+3-25)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (fastdebug 24-loom+3-25, mixed mode, sharing, tiered, compressed class ptrs, z gc, linux-amd64)
--------------- T H R E A D ---------------
Current thread (0x00007f476c3549a0): JavaThread "ForkJoinPool-1-worker-1" daemon [_thread_in_vm, id=3366473, stack(0x00007f453cf7c000,0x00007f453d07c000) (1024K)]
Stack: [0x00007f453cf7c000,0x00007f453d07c000], sp=0x00007f453d078760, free space=1009k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
V [libjvm.so+0x119cb10] EnterInterpOnlyModeClosure::do_thread(Thread*)+0x150 (jvmtiEventController.cpp:221)
V [libjvm.so+0xdad2b7] HandshakeOperation::do_handshake(JavaThread*)+0x47 (handshake.cpp:326)
V [libjvm.so+0xdad4e1] HandshakeState::process_by_self(bool, bool)+0x141 (handshake.cpp:577)
V [libjvm.so+0x1614955] SafepointMechanism::process(JavaThread*, bool, bool)+0x65 (safepointMechanism.cpp:159)
V [libjvm.so+0x7f7e81] ThreadInVMfromJava::~ThreadInVMfromJava()+0x161 (safepointMechanism.inline.hpp:83)
V [libjvm.so+0xe5e521] InterpreterRuntime::monitorenter_obj(JavaThread*, oopDesc*)+0x111 (interpreterRuntime.cpp:760)
j nsk.jvmti.SetFieldModificationWatch.setfmodw001.run([Ljava/lang/String;Ljava/io/PrintStream;)I+37
j nsk.jvmti.SetFieldModificationWatch.setfmodw001.main([Ljava/lang/String;)V+9
j java.lang.invoke.LambdaForm$DMH+0x00007f44cf003800.invokeStatic(Ljava/lang/Object;Ljava/lang/Object;)V+10 java.base@24-loom
j java.lang.invoke.LambdaForm$MH+0x00007f44cf004c00.invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;+33 java.base@24-loom
j java.lang.invoke.Invokers$Holder.invokeExact_MT(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;+20 java.base@24-loom
j jdk.internal.reflect.DirectMethodHandleAccessor.invokeImpl(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;+55 java.base@24-loom
j jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;+23 java.base@24-loom
j java.lang.reflect.Method.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;+102 java.base@24-loom
j com.sun.javatest.regtest.agent.MainWrapper$MainTask.run()V+134
j java.lang.Thread.runWith(Ljava/lang/Object;Ljava/lang/Runnable;)V+5 java.base@24-loom
j java.lang.VirtualThread.run(Ljava/lang/Runnable;)V+66 java.base@24-loom
j java.lang.VirtualThread$VThreadContinuation$1.run()V+8 java.base@24-loom
j jdk.internal.vm.Continuation.enter0()V+4 java.base@24-loom
j jdk.internal.vm.Continuation.enter(Ljdk/internal/vm/Continuation;Z)V+1 java.base@24-loom
J 62 jdk.internal.vm.Continuation.enterSpecial(Ljdk/internal/vm/Continuation;ZZ)V java.base@24-loom (0 bytes) @ 0x00007f475c2f2c24 [0x00007f475c2f2ac0+0x0000000000000164]
j jdk.internal.vm.Continuation.run()V+122 java.base@24-loom
j java.lang.VirtualThread.runContinuation()V+78 java.base@24-loom
j java.lang.VirtualThread$$Lambda+0x00007f44cf04e3e0.run()V+4 java.base@24-loom
j java.util.concurrent.ForkJoinTask$RunnableExecuteAction.compute()Ljava/lang/Void;+4 java.base@24-loom
j java.util.concurrent.ForkJoinTask$RunnableExecuteAction.compute()Ljava/lang/Object;+1 java.base@24-loom
j java.util.concurrent.ForkJoinTask$InterruptibleTask.exec()Z+51 java.base@24-loom
j java.util.concurrent.ForkJoinTask.doExec()V+10 java.base@24-loom
j java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(Ljava/util/concurrent/ForkJoinTask;I)V+9 java.base@24-loom
j java.util.concurrent.ForkJoinPool.runWorker(Ljava/util/concurrent/ForkJoinPool$WorkQueue;)V+366 java.base@24-loom
j java.util.concurrent.ForkJoinWorkerThread.run()V+31 java.base@24-loom
v ~StubRoutines::call_stub 0x00007f475bd5fcfa
V [libjvm.so+0xe7fd19] JavaCalls::call_helper(JavaValue*, methodHandle const&, JavaCallArguments*, JavaThread*)+0x4a9 (javaCalls.cpp:415)
V [libjvm.so+0xe803ac] JavaCalls::call_virtual(JavaValue*, Klass*, Symbol*, Symbol*, JavaCallArguments*, JavaThread*)+0x34c (javaCalls.cpp:329)
V [libjvm.so+0xe805c6] JavaCalls::call_virtual(JavaValue*, Handle, Klass*, Symbol*, Symbol*, JavaThread*)+0x76 (javaCalls.cpp:191)
V [libjvm.so+0xff1153] thread_entry(JavaThread*, JavaThread*)+0x93 (jvm.cpp:2949)
V [libjvm.so+0xeb8e4c] JavaThread::thread_main_inner()+0xcc (javaThread.cpp:772)
V [libjvm.so+0x17e1026] Thread::call_run()+0xb6 (thread.cpp:225)
V [libjvm.so+0x14c7297] thread_native_entry(Thread*)+0x127 (os_linux.cpp:858)
Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
J 62 jdk.internal.vm.Continuation.enterSpecial(Ljdk/internal/vm/Continuation;ZZ)V java.base@24-loom (0 bytes) @ 0x00007f475c2f2c33 [0x00007f475c2f2ac0+0x0000000000000173]
j jdk.internal.vm.Continuation.run()V+122 java.base@24-loom
j java.lang.VirtualThread.runContinuation()V+78 java.base@24-loom
j java.lang.VirtualThread$$Lambda+0x00007f44cf04e3e0.run()V+4 java.base@24-loom
j java.util.concurrent.ForkJoinTask$RunnableExecuteAction.compute()Ljava/lang/Void;+4 java.base@24-loom
j java.util.concurrent.ForkJoinTask$RunnableExecuteAction.compute()Ljava/lang/Object;+1 java.base@24-loom
j java.util.concurrent.ForkJoinTask$InterruptibleTask.exec()Z+51 java.base@24-loom
j java.util.concurrent.ForkJoinTask.doExec()V+10 java.base@24-loom
j java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(Ljava/util/concurrent/ForkJoinTask;I)V+9 java.base@24-loom
j java.util.concurrent.ForkJoinPool.runWorker(Ljava/util/concurrent/ForkJoinPool$WorkQueue;)V+366 java.base@24-loom
j java.util.concurrent.ForkJoinWorkerThread.run()V+31 java.base@24-loom
v ~StubRoutines::call_stub 0x00007f475bd5fcfa
JavaThread requesting switch to interpreter only mode:
"Thread-0" #36 daemon prio=5 tid=0x00007f44980100a0 nid=3366476 runnable [0x00007f453cf79000]
java.lang.Thread.State: RUNNABLE
JavaThread state: _thread_blocked
0x00007f4773cfc1d0 __GI___nanosleep + 0x40
0x00007f4772c667fb os::naked_short_sleep(long) + 0x4b
0x00007f477253f4ba Handshake::execute(HandshakeClosure*, ThreadsListHandle*, JavaThread*) + 0x94a
0x00007f4772929921 JvmtiEventControllerPrivate::enter_interp_only_mode(JvmtiThreadState*) + 0xa1
0x00007f4772929c00 JvmtiEventControllerPrivate::recompute_thread_enabled(JvmtiThreadState*) [clone .part.0] + 0x190
0x00007f477292ac48 JvmtiEventControllerPrivate::recompute_enabled() + 0x188
0x00007f477292d305 JvmtiEventController::change_field_watch(jvmtiEvent, bool) + 0xd5
0x00007f477290eaa6 JvmtiEnv::SetFieldModificationWatch(fieldDescriptor*) + 0x56
0x00007f47728b4cc3 jvmti_SetFieldModificationWatch + 0x343
0x00007f47743ecd9e setWatch + 0x4e
Problem seems to be that JVMTI Watched Field functions doesn’t disable transitions, so in recompute_enabled() we could see that a vthread is mounted, but in the EnterInterpOnlyModeClosure handshake the thread could have been unmounted already.
I think the only reason why we are not seeing this on mainline is because the test uses synchronize which currently doesn’t unmount. But if we were to use some j.u.c I think we would have the same issue.
- relates to
-
JDK-8338934 vmTestbase/nsk/jvmti/*Field*Watch/TestDescription.java tests timeout intermittently
-
- Resolved
-
- links to
-
Commit(master) openjdk/jdk/36d08c21
-
Review(master) openjdk/jdk/20413