https://bz.apache.org/bugzilla/show_bug.cgi?id=64733

            Bug ID: 64733
           Summary: Deadlock in JUnitLauncher Task when using
                    LegacyXmlResultFormatter
           Product: Ant
           Version: 1.10.8
          Hardware: PC
            Status: NEW
          Severity: normal
          Priority: P2
         Component: Optional Tasks
          Assignee: notifications@ant.apache.org
          Reporter: mse...@guh-software.de
  Target Milestone: ---

Created attachment 37447
  --> https://bz.apache.org/bugzilla/attachment.cgi?id=37447&action=edit
Fix of the deadlock

We experienced a (reproducable) deadlock in 

https://github.com/apache/ant/blob/7e6cc33e04ecf6fae6f51d24f67c21bd321d13ee/src/main/org/apache/tools/ant/taskdefs/optional/junitlauncher/LauncherSupport.java#L406

when the IOException has been triggered in

https://github.com/apache/ant/blob/7e6cc33e04ecf6fae6f51d24f67c21bd321d13ee/src/main/org/apache/tools/ant/taskdefs/optional/junitlauncher/LauncherSupport.java#L513

and a test writes something to System.err

This happens because PipedOutputStream & PipedInputStream has been used in a
single thread which is not recommended (see
https://stackoverflow.com/a/9171708/2523032).

I've attached a patch that fixes the problem and will attach a Testcase to
reproduce it.
This is how we can reproduce the deadlock on every run:

- Add "throw new IOException("TEST");" after line
https://github.com/apache/ant/blob/7e6cc33e04ecf6fae6f51d24f67c21bd321d13ee/src/main/org/apache/tools/ant/taskdefs/optional/junitlauncher/LauncherSupport.java#L511
(I did not find any other solution to trigger a IOException reproducable)
- Run my attached TestCase with the attached Ant script (I've created a
zip-file with all the libs, too)
- The ant process should now hang in the deadlock
- After applying the patch the deadlock should be gone


Here is the threaddump of the problem:

"junitlauncher-syserr-stream-reader" #6070 daemon prio=5 os_prio=0
tid=0x000000005739e800 nid=0x1778 in Object.wait() [0x000000005eabe000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        at java.io.PipedInputStream.awaitSpace(PipedInputStream.java:273)
        at java.io.PipedInputStream.receive(PipedInputStream.java:231)
        - locked <0x00000000c749a770> (a java.io.PipedInputStream)
        at java.io.PipedOutputStream.write(PipedOutputStream.java:149)
        at java.io.PrintStream.write(PrintStream.java:480)
        - locked <0x00000000c74c1fe0> (a java.io.PrintStream)
        at java.io.PrintStream.write(PrintStream.java:480)
        - locked <0x00000000c74c1fc0> (a java.io.PrintStream)
        at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221)
        at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:291)
        at sun.nio.cs.StreamEncoder.flushBuffer(StreamEncoder.java:104)
        - locked <0x00000000c74c2140> (a java.io.OutputStreamWriter)
        at java.io.OutputStreamWriter.flushBuffer(OutputStreamWriter.java:185)
        at java.io.PrintStream.write(PrintStream.java:527)
        - locked <0x00000000c74c1fc0> (a java.io.PrintStream)
        at java.io.PrintStream.print(PrintStream.java:669)
        at java.io.PrintStream.println(PrintStream.java:823)
        - locked <0x00000000c74c1fc0> (a java.io.PrintStream)
        at java.lang.Throwable$WrappedPrintStream.println(Throwable.java:748)
        at java.lang.Throwable.printStackTrace(Throwable.java:658)
        - locked <0x00000000c74c1fc0> (a java.io.PrintStream)
        at java.lang.Throwable.printStackTrace(Throwable.java:643)
        at java.lang.Throwable.printStackTrace(Throwable.java:634)
        at
org.apache.tools.ant.taskdefs.optional.junitlauncher.LauncherSupport.log(LauncherSupport.java:406)
        at
org.apache.tools.ant.taskdefs.optional.junitlauncher.LauncherSupport.access$0(LauncherSupport.java:396)
        at
org.apache.tools.ant.taskdefs.optional.junitlauncher.LauncherSupport$SysOutErrStreamReader.run(LauncherSupport.java:514)
        at java.lang.Thread.run(Thread.java:748)

   Locked ownable synchronizers:
        - None

"main" #1 prio=5 os_prio=0 tid=0x000000000210a800 nid=0x25fc waiting for
monitor entry [0x000000000231c000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at java.io.PrintStream.println(PrintStream.java:805)
        - waiting to lock <0x00000000c74c1fc0> (a java.io.PrintStream)
        at
de.guhsoft.eDHR.regressionTest.tools.PrepareDatabase.removeWorkplaceConfiguration(PrepareDatabase.java:499)
        at
de.guhsoft.eDHR.regressionTest.production.AbstractProductionTest.resetWorkplaceConfiguration(AbstractProductionTest.java:816)
        at
de.guhsoft.eDHR.regressionTest.production.packaging.PackagingTest.testSuccessWithBoxSizes(PackagingTest.java:2656)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at
org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:686)
        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.TimeoutExtension.intercept(TimeoutExtension.java:149)
        at
org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140)
        at
org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84)
        at
org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor$$Lambda$186/555826066.apply(Unknown
Source)
        at
org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115)
        at
org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall$$Lambda$187/1386767190.apply(Unknown
Source)
        at
org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)
        at
org.junit.jupiter.engine.execution.ExecutableInvoker$$Lambda$248/815992954.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.ExecutableInvoker.invoke(ExecutableInvoker.java:104)
        at
org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98)
        at
org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:205)
        at
org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor$$Lambda$304/2024542466.execute(Unknown
Source)
        at
org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
        at
org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:201)
        at
org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:137)
        at
org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:71)
        at
org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:135)
        at
org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$112/1286783232.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$7(NodeTestTask.java:125)
        at
org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$111/66233253.invoke(Unknown
Source)
        at
org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
        at
org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
        at
org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$110/1393931310.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:122)
        at
org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
        at
org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService$$Lambda$202/2142003995.accept(Unknown
Source)
        at java.util.ArrayList.forEach(ArrayList.java:1257)
        at
org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
        at
org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
        at
org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$112/1286783232.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$7(NodeTestTask.java:125)
        at
org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$111/66233253.invoke(Unknown
Source)
        at
org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
        at
org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
        at
org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$110/1393931310.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:122)
        at
org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
        at
org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService$$Lambda$202/2142003995.accept(Unknown
Source)
        at java.util.ArrayList.forEach(ArrayList.java:1257)
        at
org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
        at
org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
        at
org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$112/1286783232.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$7(NodeTestTask.java:125)
        at
org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$111/66233253.invoke(Unknown
Source)
        at
org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
        at
org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
        at
org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$110/1393931310.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:122)
        at
org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
        at
org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
        at
org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
        at
org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
        at
org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:248)
        at
org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$5(DefaultLauncher.java:211)
        at
org.junit.platform.launcher.core.DefaultLauncher$$Lambda$76/1205044462.accept(Unknown
Source)
        at
org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:226)
        at
org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:199)
        at
org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:132)
        at
org.apache.tools.ant.taskdefs.optional.junitlauncher.LauncherSupport.launch(LauncherSupport.java:141)
        at
org.apache.tools.ant.taskdefs.optional.junitlauncher.StandaloneLauncher.main(StandaloneLauncher.java:114)

   Locked ownable synchronizers:
        - None

-- 
You are receiving this mail because:
You are the assignee for the bug.

Reply via email to