Denis Chudov created IGNITE-27493:
-------------------------------------

             Summary: Test timeout may not work due to FJP await in cluster 
shutdown
                 Key: IGNITE-27493
                 URL: https://issues.apache.org/jira/browse/IGNITE-27493
             Project: Ignite
          Issue Type: Bug
            Reporter: Denis Chudov


Sometimes we see test suite timeouts like this:

[https://ci.ignite.apache.org/buildConfiguration/ApacheIgnite3x_Test_IntegrationTests_SystemDisasterRecovery/9876671]

Full log is attached.

There is stack trace in thread dump:

 
{code:java}
                 "Test worker" #1 prio=5 os_prio=0 cpu=19887.94ms 
elapsed=3540.59s tid=0x00007fab3002f000 nid=0x4e547 in Object.wait()  
[0x00007fab363fa000]
                    java.lang.Thread.State: WAITING (on object monitor)
                     at java.lang.Object.wait([email protected]/Native Method)
                     - waiting on <no object reference available>
                     at 
java.util.concurrent.ForkJoinTask.externalAwaitDone([email protected]/ForkJoinTask.java:330)
                     - waiting to re-lock in wait() <0x000000072881e770> (a 
java.util.stream.ForEachOps$ForEachTask)
                     at 
java.util.concurrent.ForkJoinTask.doInvoke([email protected]/ForkJoinTask.java:412)
                     at 
java.util.concurrent.ForkJoinTask.invoke([email protected]/ForkJoinTask.java:736)
                     at 
java.util.stream.ForEachOps$ForEachOp.evaluateParallel([email protected]/ForEachOps.java:159)
                     at 
java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateParallel([email protected]/ForEachOps.java:173)
                     at 
java.util.stream.AbstractPipeline.evaluate([email protected]/AbstractPipeline.java:233)
                     at 
java.util.stream.ReferencePipeline.forEach([email protected]/ReferencePipeline.java:497)
                     at 
org.apache.ignite.internal.Cluster.stopNodes(Cluster.java:690)
                     at 
org.apache.ignite.internal.Cluster.shutdown(Cluster.java:672)
                     at 
org.apache.ignite.internal.ClusterPerTestIntegrationTest.stopCluster(ClusterPerTestIntegrationTest.java:89)
                     at 
jdk.internal.reflect.NativeMethodAccessorImpl.invoke0([email protected]/Native 
Method)
                     at 
jdk.internal.reflect.NativeMethodAccessorImpl.invoke([email protected]/NativeMethodAccessorImpl.java:62)
                     at 
jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke([email protected]/DelegatingMethodAccessorImpl.java:43)
                     at 
java.lang.reflect.Method.invoke([email protected]/Method.java:566)
                     at 
org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:786)
                     at 
org.junit.platform.commons.support.ReflectionSupport.invokeMethod(ReflectionSupport.java:514)
                     at 
org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
                     at 
org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
                     at 
org.junit.jupiter.engine.extension.SameThreadTimeoutInvocation.proceed(SameThreadTimeoutInvocation.java:49)
                     at 
org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:161)
                     at 
org.junit.jupiter.engine.extension.TimeoutExtension.interceptLifecycleMethod(TimeoutExtension.java:133)
                     at 
org.junit.jupiter.engine.extension.TimeoutExtension.interceptAfterEachMethod(TimeoutExtension.java:115)
                     at 
org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor$$Lambda$5077/0x0000000800d93440.apply(Unknown
 Source)
                     at 
org.junit.jupiter.engine.execution.InterceptingExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(InterceptingExecutableInvoker.java:112)
                     at 
org.junit.jupiter.engine.execution.InterceptingExecutableInvoker$ReflectiveInterceptorCall$$Lambda$277/0x00000008001da840.apply(Unknown
 Source)
                     at 
org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.lambda$invoke$0(InterceptingExecutableInvoker.java:94)
                     at 
org.junit.jupiter.engine.execution.InterceptingExecutableInvoker$$Lambda$505/0x000000080022dc40.apply(Unknown
 Source)
                     at 
org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
                     at 
org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
                     at 
org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
                     at 
org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
                     at 
org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:93)
                     at 
org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:87)
                     at 
org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeMethodInExtensionContext(ClassBasedTestDescriptor.java:547)
                     at 
org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$synthesizeAfterEachMethodAdapter$21(ClassBasedTestDescriptor.java:537)
                     at 
org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor$$Lambda$453/0x0000000800220840.invokeAfterEachMethod(Unknown
 Source)
                     at 
org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeAfterEachMethods$6(TestMethodTestDescriptor.java:246)
                     at 
org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor$$Lambda$5075/0x0000000800d86440.invoke(Unknown
 Source)
                     at 
org.junit.jupiter.engine.descriptor.CallbackSupport.lambda$invokeAfterCallbacks$1(CallbackSupport.java:49)
                     at 
org.junit.jupiter.engine.descriptor.CallbackSupport$$Lambda$5076/0x0000000800d93040.execute(Unknown
 Source)
                     at 
org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
                     at 
org.junit.jupiter.engine.descriptor.CallbackSupport.lambda$invokeAfterCallbacks$2(CallbackSupport.java:49)
                     at 
org.junit.jupiter.engine.descriptor.CallbackSupport$$Lambda$5074/0x0000000800d86040.accept(Unknown
 Source)
                     at 
org.junit.platform.commons.util.CollectionUtils.forEachInReverseOrder(CollectionUtils.java:262)
                     at 
org.junit.jupiter.engine.descriptor.CallbackSupport.invokeAfterCallbacks(CallbackSupport.java:48)
                     at 
org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeAfterEachMethods(TestMethodTestDescriptor.java:244)
                     at 
org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:163)
                     at 
org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:70)
                     at 
org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:157)
                     at 
org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$414/0x000000080020b040.execute(Unknown
 Source)
                     at 
org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
                     at 
org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:147)
                     at 
org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$413/0x000000080020bc40.invoke(Unknown
 Source)
                     at 
org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
                     at 
org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:145)
                     at 
org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$412/0x000000080020b840.execute(Unknown
 Source)
                     at 
org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
                     at 
org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:144)
                     at 
org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:101)
                     at 
org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService$$Lambda$418/0x000000080020a040.accept(Unknown
 Source)
                     at 
java.util.ArrayList.forEach([email protected]/ArrayList.java:1541)
                     at 
org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
                     at 
org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:161)
                     at 
org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$414/0x000000080020b040.execute(Unknown
 Source)
                     at 
org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
                     at 
org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:147)
                     at 
org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$413/0x000000080020bc40.invoke(Unknown
 Source)
                     at 
org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
                     at 
org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:145)
                     at 
org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$412/0x000000080020b840.execute(Unknown
 Source)
                     at 
org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
                     at 
org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:144)
                     at 
org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:101)
                     at 
org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService$$Lambda$418/0x000000080020a040.accept(Unknown
 Source)
                     at 
java.util.ArrayList.forEach([email protected]/ArrayList.java:1541)
                     at 
org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
                     at 
org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:161)
                     at 
org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$414/0x000000080020b040.execute(Unknown
 Source)
                     at 
org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
                     at 
org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:147)
                     at 
org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$413/0x000000080020bc40.invoke(Unknown
 Source)
                     at 
org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
                     at 
org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:145)
                     at 
org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$412/0x000000080020b840.execute(Unknown
 Source)
                     at 
org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
                     at 
org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:144)
                     at 
org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:101)
                     at 
org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35)
                     at 
org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
                     at 
org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54)
                     at 
org.junit.platform.launcher.core.EngineExecutionOrchestrator.executeEngine(EngineExecutionOrchestrator.java:230)
                     at 
org.junit.platform.launcher.core.EngineExecutionOrchestrator.failOrExecuteEngine(EngineExecutionOrchestrator.java:204)
                     at 
org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:172)
                     at 
org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:101)
                     at 
org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:64)
                     at 
org.junit.platform.launcher.core.EngineExecutionOrchestrator$$Lambda$349/0x00000008001ed040.accept(Unknown
 Source)
                     at 
org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:150)
                     at 
org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:63)
                     at 
org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:109)
                     at 
org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:91)
                     at 
org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47)
                     at 
org.junit.platform.launcher.core.InterceptingLauncher.lambda$execute$1(InterceptingLauncher.java:39)
                     at 
org.junit.platform.launcher.core.InterceptingLauncher$$Lambda$88/0x000000080016e040.proceed(Unknown
 Source)
                     at 
org.junit.platform.launcher.core.ClasspathAlignmentCheckingLauncherInterceptor.intercept(ClasspathAlignmentCheckingLauncherInterceptor.java:25)
                     at 
org.junit.platform.launcher.core.InterceptingLauncher.execute(InterceptingLauncher.java:38)
                     at 
org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47)
                     at 
org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:119)
                     at 
org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:94)
                     at 
org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:89)
                     at 
org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:62)
                     at 
jdk.internal.reflect.NativeMethodAccessorImpl.invoke0([email protected]/Native 
Method)
                     at 
jdk.internal.reflect.NativeMethodAccessorImpl.invoke([email protected]/NativeMethodAccessorImpl.java:62)
                     at 
jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke([email protected]/DelegatingMethodAccessorImpl.java:43)
                     at 
java.lang.reflect.Method.invoke([email protected]/Method.java:566)
                     at 
org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
                     at 
org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
                     at 
org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33)
                     at 
org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94)
                     at com.sun.proxy.$Proxy2.stop(Unknown Source)
                     at 
org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:193)
                     at 
org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:129)
                     at 
org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:100)
                     at 
org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:60)
                     at 
org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56)
                     at 
org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:113)
                     at 
org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:65)
                     at 
worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69)
                     at 
worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74)
                  {code}
ClusterPerTestIntegrationTest#stopCluster is annotated with @Timeout which 
should interrupt the thread after timeout, see 
[https://docs.junit.org/5.12.0/user-guide/index.html]

But in stack trace we can see ForkJoinTask#externalAwaitDone which swallows 
InterruptedException and waits forever even if cluster shutdown can't be 
completed for some reason.

The actual reason of cluster shutdown failure is unclear in this case: thread 
dump of test jvm has few threads, probably some of them were interrupted for 
some reason, and no thread may fire an event that shutdown worker may wait for.

Proposal: make the test cluster shutdown limited by time using another way, or 
avoid using FJP in the test cluster shutdown code.

 

 



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to