Open
Description
Describe the bug
reproducer below
After upgrading my app to 3.11.0 from 3.10.2 and changing nothing else, suddenly I get deadlocks. I turned on virtual thread pinning logs and indeed my carrier threads got pinned. Interestingly enough, there is no <- monitor
in the stack, so I think this is not caused by synchronization but maybe a native call? This might be related to the class loader changes in 3.11:
Pinned thread trace log:
Thread[#67,ForkJoinPool-1-worker-1,5,CarrierThreads]
java.base/java.lang.VirtualThread$VThreadContinuation.onPinned(VirtualThread.java:185)
java.base/jdk.internal.vm.Continuation.onPinned0(Continuation.java:393)
java.base/java.lang.VirtualThread.park(VirtualThread.java:592)
java.base/java.lang.System$2.parkVirtualThread(System.java:2639)
java.base/jdk.internal.misc.VirtualThreads.park(VirtualThreads.java:54)
java.base/java.util.concurrent.locks.LockSupport.park(LockSupport.java:219)
java.base/java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:754)
java.base/java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireShared(AbstractQueuedSynchronizer.java:1079)
java.base/java.util.concurrent.locks.ReentrantReadWriteLock$ReadLock.lock(ReentrantReadWriteLock.java:738)
io.quarkus.bootstrap.runner.JarResource.readLockAcquireAndGetJarReference(JarResource.java:156)
io.quarkus.bootstrap.runner.JarResource.getResourceData(JarResource.java:72)
io.quarkus.bootstrap.runner.RunnerClassLoader.loadClass(RunnerClassLoader.java:105)
io.quarkus.bootstrap.runner.RunnerClassLoader.loadClass(RunnerClassLoader.java:71)
org.acme.GreetingResource.lambda$init$0(GreetingResource.java:32)
java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572)
java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
java.base/java.lang.VirtualThread.run(VirtualThread.java:311)
Expected behavior
Should not pin carrier threads as before
Actual behavior
Pins carrier threads. This happens in parallel in the actual application, so it ends up pinning all threads and deadlocking the application.
How to Reproduce?
Minimal reproducer:
var cl = Thread.currentThread()
.getContextClassLoader();
System.out.println(cl.getClass());
try(var exec = Executors.newVirtualThreadPerTaskExecutor()) {
for(int i = 0; i < 2; i++) {
exec.submit(()->{
try {
cl.loadClass("an application class name here");
} catch (Exception e) {
e.printStackTrace();
}
});
}
}
- Build with maven, then run from target/quarkus-app with -Djdk.tracePinnedThreads=short
- Observe thread pin warnings in the log
- Another weirdness is that even though prinning trace is set to "short", it prints full stacks?
Output of uname -a
or ver
win64
Output of java -version
build 21+35-2513
Quarkus version or git rev
3.11.0
Build tool (ie. output of mvnw --version
or gradlew --version
)
mvn
Additional information
No response
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Metadata
Assignees
Type
Projects
Status
Planned