Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8336846

assert(state->get_thread() == jt) failed: handshake unsafe conditions

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Fixed
    • Icon: P3 P3
    • 24
    • 24
    • hotspot
    • None
    • b10

      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.

            sspitsyn Serguei Spitsyn
            pchilanomate Patricio Chilano Mateo
            Votes:
            0 Vote for this issue
            Watchers:
            5 Start watching this issue

              Created:
              Updated:
              Resolved: