Skip to content

[BUG] Inline bytecode transformer randomly deadlocking on Java 19 #2767

@ascopes

Description

@ascopes

When running tests, I appear to be hitting a deadlock in random places. This is occurring on tests not even using Mockito, so I assume this is down to the bytecode transformer. It appears to be totally random as to where it actually occurs, and sometimes it won't occur at all.

    <dependency>
      <groupId>org.mockito</groupId>
      <artifactId>mockito-inline</artifactId>
      <version>4.8.1</version>
      <scope>test</scope>
    </dependency>
    
    ...
    
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-surefire-plugin</artifactId>
      <version>3.0.0-M7</version>
    </plugin>

I can reproduce this on Mockito 4.8.0 as well.

$ java -version
openjdk version "19" 2022-09-20
OpenJDK Runtime Environment Corretto-19.0.0.36.1 (build 19+36-FR)
OpenJDK 64-Bit Server VM Corretto-19.0.0.36.1 (build 19+36-FR, mixed mode, sharing)

$ uname -a
Linux z170x-fedora 5.19.13-200.fc36.x86_64 #1 SMP PREEMPT_DYNAMIC Tue Oct 4 15:42:43 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

I managed to capture this stacktrace using Java Mission Control. Not sure how helpful this is though.

# Created at 2022-10-18T12:05:44.041
Thread dump for process (15260@z170x-fedora):
"main" 
   java.lang.Thread.State: WAITING
        at java.base@19/jdk.internal.misc.Unsafe.park(Native Method)
        at java.base@19/java.util.concurrent.locks.LockSupport.park(LockSupport.java:221)
        at java.base@19/java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:715)
        at java.base@19/java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:938)
        at java.base@19/java.util.concurrent.locks.ReentrantLock$Sync.lock(ReentrantLock.java:153)
        at java.base@19/java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:322)
        at java.base@19/java.lang.ref.ReferenceQueue.poll(ReferenceQueue.java:182)
        at app/org.mockito@4.8.1/org.mockito.internal.util.concurrent.WeakConcurrentMap.expungeStaleEntries(WeakConcurrentMap.java:138)
        at app/org.mockito@4.8.1/org.mockito.internal.util.concurrent.WeakConcurrentMap$WithInlinedExpunction.containsKey(WeakConcurrentMap.java:272)
        at app/org.mockito@4.8.1/org.mockito.internal.creation.bytebuddy.MockMethodAdvice.isMock(MockMethodAdvice.java:166)
        at java.base@19/java.lang.Object.equals(Object.java:164)
        at java.base@19/java.lang.reflect.Method.equals(Method.java:368)
        at java.base@19/java.util.HashMap.getNode(HashMap.java:578)
        at java.base@19/java.util.HashMap.get(HashMap.java:564)
        at app/net.bytebuddy@1.12.10/net.bytebuddy.utility.dispatcher.JavaDispatcher$ProxiedInvocationHandler.invoke(JavaDispatcher.java:1152)
        at app/net.bytebuddy@1.12.10/net.bytebuddy.description.method.$Proxy43.getParameterCount(Unknown Source)
        at app/net.bytebuddy@1.12.10/net.bytebuddy.description.method.ParameterList$ForLoadedExecutable.size(ParameterList.java:226)
        at app/net.bytebuddy@1.12.10/net.bytebuddy.description.method.ParameterList$TypeSubstituting.size(ParameterList.java:596)
        at app/net.bytebuddy@1.12.10/net.bytebuddy.description.method.ParameterList$AbstractBase.asTypeList(ParameterList.java:105)
        at app/net.bytebuddy@1.12.10/net.bytebuddy.description.method.MethodDescription$AbstractBase.asTypeToken(MethodDescription.java:910)
        at app/net.bytebuddy@1.12.10/net.bytebuddy.dynamic.scaffold.MethodGraph$Compiler$Default$Key$Store.asGraph(MethodGraph.java:1253)
        at app/net.bytebuddy@1.12.10/net.bytebuddy.dynamic.scaffold.MethodGraph$Compiler$Default.compile(MethodGraph.java:660)
        at app/net.bytebuddy@1.12.10/net.bytebuddy.dynamic.scaffold.MethodGraph$Compiler$AbstractBase.compile(MethodGraph.java:519)
        at app/net.bytebuddy@1.12.10/net.bytebuddy.dynamic.scaffold.MethodRegistry$Default.prepare(MethodRegistry.java:472)
        at app/net.bytebuddy@1.12.10/net.bytebuddy.dynamic.scaffold.subclass.SubclassDynamicTypeBuilder.make(SubclassDynamicTypeBuilder.java:213)
        at app/net.bytebuddy@1.12.10/net.bytebuddy.dynamic.scaffold.subclass.SubclassDynamicTypeBuilder.make(SubclassDynamicTypeBuilder.java:204)
        at app/net.bytebuddy@1.12.10/net.bytebuddy.dynamic.DynamicType$Builder$AbstractBase.make(DynamicType.java:3668)
        at app/net.bytebuddy@1.12.10/net.bytebuddy.dynamic.DynamicType$Builder$AbstractBase$Delegator.make(DynamicType.java:3906)
        at app/org.assertj.core@3.23.1/org.assertj.core.api.SoftProxies.generateProxyClass(SoftProxies.java:217)
        at app/org.assertj.core@3.23.1/org.assertj.core.api.SoftProxies.lambda$createSoftAssertionProxyClass$0(SoftProxies.java:135)
        at app/org.assertj.core@3.23.1/org.assertj.core.api.SoftProxies$$Lambda$1138/0x00000007c05d4818.call(Unknown Source)
        at app/net.bytebuddy@1.12.10/net.bytebuddy.TypeCache.findOrInsert(TypeCache.java:168)
        at app/net.bytebuddy@1.12.10/net.bytebuddy.TypeCache$WithInlineExpunction.findOrInsert(TypeCache.java:399)
        at app/org.assertj.core@3.23.1/org.assertj.core.api.SoftProxies.createSoftAssertionProxyClass(SoftProxies.java:134)
        at app/org.assertj.core@3.23.1/org.assertj.core.api.SoftProxies.createSoftAssertionProxy(SoftProxies.java:120)
        at app/org.assertj.core@3.23.1/org.assertj.core.api.AbstractSoftAssertions.proxy(AbstractSoftAssertions.java:48)
        at app/org.assertj.core@3.23.1/org.assertj.core.api.StandardSoftAssertionsProvider.assertThat(StandardSoftAssertionsProvider.java:56)
        at app/io.github.ascopes.jct.testing@0.0.1-SNAPSHOT/io.github.ascopes.jct.testing.unit.containers.impl.FileUtilsTest.lambda$simpleClassNameToPathShouldReturnTheExpectedOutput$3(FileUtilsTest.java:229)
        at app/io.github.ascopes.jct.testing@0.0.1-SNAPSHOT/io.github.ascopes.jct.testing.unit.containers.impl.FileUtilsTest$$Lambda$1135/0x00000007c05cae88.accept(Unknown Source)
        at app/org.assertj.core@3.23.1/org.assertj.core.api.SoftAssertionsProvider.assertSoftly(SoftAssertionsProvider.java:119)
        at app/org.assertj.core@3.23.1/org.assertj.core.api.SoftAssertions.assertSoftly(SoftAssertions.java:162)
        at app/io.github.ascopes.jct.testing@0.0.1-SNAPSHOT/io.github.ascopes.jct.testing.unit.containers.impl.FileUtilsTest.simpleClassNameToPathShouldReturnTheExpectedOutput(FileUtilsTest.java:228)
        at java.base@19/java.lang.invoke.LambdaForm$DMH/0x00000007c05cdc00.invokeVirtual(LambdaForm$DMH)
        at java.base@19/java.lang.invoke.LambdaForm$MH/0x00000007c05cf400.invoke(LambdaForm$MH)
        at java.base@19/java.lang.invoke.Invokers$Holder.invokeExact_MT(Invokers$Holder)
        at java.base@19/jdk.internal.reflect.DirectMethodHandleAccessor.invokeImpl(DirectMethodHandleAccessor.java:158)
        at java.base@19/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
        at java.base@19/java.lang.reflect.Method.invoke(Method.java:578)
        at app/org.junit.platform.commons@1.9.1/org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:727)
        at app/org.junit.jupiter.engine@5.9.1/org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
        at app/org.junit.jupiter.engine@5.9.1/org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
        at app/org.junit.jupiter.engine@5.9.1/org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:156)
        at app/org.junit.jupiter.engine@5.9.1/org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:147)
        at app/org.junit.jupiter.engine@5.9.1/org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestTemplateMethod(TimeoutExtension.java:94)
        at app/org.junit.jupiter.engine@5.9.1/org.junit.jupiter.engine.descriptor.TestTemplateInvocationTestDescriptor$$Lambda$458/0x00000007c01d8ab8.apply(Unknown Source)
        at app/org.junit.jupiter.engine@5.9.1/org.junit.jupiter.engine.execution.InterceptingExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(InterceptingExecutableInvoker.java:103)
        at app/org.junit.jupiter.engine@5.9.1/org.junit.jupiter.engine.execution.InterceptingExecutableInvoker$ReflectiveInterceptorCall$$Lambda$296/0x00000007c0189c00.apply(Unknown Source)
        at app/org.junit.jupiter.engine@5.9.1/org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.lambda$invoke$0(InterceptingExecutableInvoker.java:93)
        at app/org.junit.jupiter.engine@5.9.1/org.junit.jupiter.engine.execution.InterceptingExecutableInvoker$$Lambda$473/0x00000007c01de000.apply(Unknown Source)
        at app/org.junit.jupiter.engine@5.9.1/org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
        at app/org.junit.jupiter.engine@5.9.1/org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
        at app/org.junit.jupiter.engine@5.9.1/org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
        at app/org.junit.jupiter.engine@5.9.1/org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
        at app/org.junit.jupiter.engine@5.9.1/org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:92)
        at app/org.junit.jupiter.engine@5.9.1/org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:86)
        at app/org.junit.jupiter.engine@5.9.1/org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:217)
        at app/org.junit.jupiter.engine@5.9.1/org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor$$Lambda$497/0x00000007c01e0650.execute(Unknown Source)
        at app/org.junit.platform.engine@1.9.1/org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
        at app/org.junit.jupiter.engine@5.9.1/org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:213)
        at app/org.junit.jupiter.engine@5.9.1/org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:138)
        at app/org.junit.jupiter.engine@5.9.1/org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:68)
        at app/org.junit.platform.engine@1.9.1/org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:151)
        at app/org.junit.platform.engine@1.9.1/org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$371/0x00000007c01bdca8.execute(Unknown Source)
        at app/org.junit.platform.engine@1.9.1/org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
        at app/org.junit.platform.engine@1.9.1/org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)
        at app/org.junit.platform.engine@1.9.1/org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$370/0x00000007c01bda98.invoke(Unknown Source)
        at app/org.junit.platform.engine@1.9.1/org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
        at app/org.junit.platform.engine@1.9.1/org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
        at app/org.junit.platform.engine@1.9.1/org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$369/0x00000007c01bd6a0.execute(Unknown Source)
        at app/org.junit.platform.engine@1.9.1/org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
        at app/org.junit.platform.engine@1.9.1/org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
        at app/org.junit.platform.engine@1.9.1/org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
        at app/org.junit.platform.engine@1.9.1/org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35)
        at app/org.junit.platform.engine@1.9.1/org.junit.platform.engine.support.hierarchical.NodeTestTask$DefaultDynamicTestExecutor.execute(NodeTestTask.java:226)
        at app/org.junit.platform.engine@1.9.1/org.junit.platform.engine.support.hierarchical.NodeTestTask$DefaultDynamicTestExecutor.execute(NodeTestTask.java:204)
        at app/org.junit.jupiter.engine@5.9.1/org.junit.jupiter.engine.descriptor.TestTemplateTestDescriptor.execute(TestTemplateTestDescriptor.java:142)
        at app/org.junit.jupiter.engine@5.9.1/org.junit.jupiter.engine.descriptor.TestTemplateTestDescriptor.lambda$execute$2(TestTemplateTestDescriptor.java:110)
        at app/org.junit.jupiter.engine@5.9.1/org.junit.jupiter.engine.descriptor.TestTemplateTestDescriptor$$Lambda$438/0x00000007c01cb628.accept(Unknown Source)
        at java.base@19/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
        at java.base@19/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
        at java.base@19/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
        at java.base@19/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
        at java.base@19/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
        at java.base@19/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
        at java.base@19/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
        at java.base@19/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
        at java.base@19/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625)
        at java.base@19/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762)
        at java.base@19/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:276)
        at java.base@19/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions