Hi folks,
I've found a deadlock at StateMachine#handle(StateMachine.java:129)
and StateMachineProxyBuilder
$MethodInvocationHandler.invoke(StateMachineProxyBuilder.java:253),
when using two layered state machines in pipeline. It get into
deadlock because both methods seems to be called concurrently.
Does anyone know how to avoid such deadlock???
See the full Thread dump at the end of this message.
Best regards,
--
Rafael Marins
--------------------------------- F U L L T H R E A D D U
M P ---------------------------------
Full thread dump Java HotSpot(TM) Client VM (1.5.0_19-137 mixed mode,
sharing):
"IsdnWorker(port 44237): id 937943, 55551111 => 55552222" prio=5
tid=0x01013cf0 nid=0x88c600 waiting for monitor entry
[0xb0d0b000..0xb0d0bd90]
at org.apache.mina.statemachine.StateMachine.handle(StateMachine.java:
129)
- waiting to lock <0x296300c0> (a
org.apache.mina.statemachine.context.DefaultStateContext)
at org.apache.mina.statemachine.StateMachineProxyBuilder
$MethodInvocationHandler.invoke(StateMachineProxyBuilder.java:253)
at $Proxy12.writeComplete(Unknown Source)
at
org
.neociclo
.netty
.statemachine
.DefaultStateMachineChannelHandler
.handleUpstream(DefaultStateMachineChannelHandler.java:57)
at
org
.neociclo
.netty
.statemachine
.ChannelAllCoverageWrapper
.handleUpstream(ChannelAllCoverageWrapper.java:55)
at
org
.jboss
.netty
.channel
.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:567)
at org.jboss.netty.channel.DefaultChannelPipeline
$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:
803)
at
org
.neociclo
.netty
.statemachine
.SimpleStateMachineHandler.handleEvent(SimpleStateMachineHandler.java:
55)
at
org
.neociclo
.isdn
.netty
.handler.PhysicalLinkHandler.unhandledEvent(PhysicalLinkHandler.java:
193)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun
.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:
39)
at
sun
.reflect
.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:
25)
at java.lang.reflect.Method.invoke(Method.java:585)
at
org
.apache
.mina
.statemachine
.transition.MethodTransition.invokeMethod(MethodTransition.java:272)
at
org
.apache
.mina
.statemachine
.transition.MethodTransition.doExecute(MethodTransition.java:229)
at
org
.apache
.mina
.statemachine
.transition.AbstractTransition.execute(AbstractTransition.java:73)
at org.apache.mina.statemachine.StateMachine.handle(StateMachine.java:
173)
at org.apache.mina.statemachine.StateMachine.handle(StateMachine.java:
263)
at
org
.apache.mina.statemachine.StateMachine.processEvents(StateMachine.java:
160)
at org.apache.mina.statemachine.StateMachine.handle(StateMachine.java:
147)
- locked <0x29630390> (a
org.apache.mina.statemachine.context.DefaultStateContext)
at org.apache.mina.statemachine.StateMachineProxyBuilder
$MethodInvocationHandler.invoke(StateMachineProxyBuilder.java:253)
at $Proxy12.messageReceived(Unknown Source)
at
org
.neociclo
.netty
.statemachine
.DefaultStateMachineChannelHandler
.handleUpstream(DefaultStateMachineChannelHandler.java:54)
at
org
.neociclo
.netty
.statemachine
.ChannelAllCoverageWrapper
.handleUpstream(ChannelAllCoverageWrapper.java:55)
at
org
.jboss
.netty
.channel
.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:567)
at
org
.jboss
.netty
.channel
.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:562)
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:
342)
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:
329)
at org.neociclo.isdn.netty.channel.IsdnWorker.run(IsdnWorker.java:344)
at
org
.jboss
.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:113)
at
org
.jboss.netty.util.internal.IoWorkerRunnable.run(IoWorkerRunnable.java:
53)
at java.util.concurrent.ThreadPoolExecutor
$Worker.runTask(ThreadPoolExecutor.java:651)
at java.util.concurrent.ThreadPoolExecutor
$Worker.run(ThreadPoolExecutor.java:676)
at java.lang.Thread.run(Thread.java:613)
"ReaderThread" prio=5 tid=0x0100c750 nid=0x88b800 runnable
[0xb0c8a000..0xb0c8ad90]
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at sun.nio.cs.StreamDecoder$CharsetSD.readBytes(StreamDecoder.java:411)
at sun.nio.cs.StreamDecoder$CharsetSD.implRead(StreamDecoder.java:453)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:183)
- locked <0x29abf8a0> (a java.io.InputStreamReader)
at java.io.InputStreamReader.read(InputStreamReader.java:167)
at java.io.BufferedReader.fill(BufferedReader.java:136)
at java.io.BufferedReader.readLine(BufferedReader.java:299)
- locked <0x29abf8a0> (a java.io.InputStreamReader)
at java.io.BufferedReader.readLine(BufferedReader.java:362)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner
$ReaderThread.run(RemoteTestRunner.java:140)
"Low Memory Detector" daemon prio=5 tid=0x010091d0 nid=0x81aa00
runnable [0x00000000..0x00000000]
"CompilerThread0" daemon prio=9 tid=0x010087c0 nid=0x819c00 waiting on
condition [0x00000000..0xb0b077d8]
"Signal Dispatcher" daemon prio=9 tid=0x01008330 nid=0x817800 waiting
on condition [0x00000000..0x00000000]
"Finalizer" daemon prio=8 tid=0x01007b30 nid=0x816600 in Object.wait()
[0xb0a05000..0xb0a05d90]
at java.lang.Object.wait(Native Method)
- waiting on <0x29a9d978> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:120)
- locked <0x29a9d978> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:136)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)
"Reference Handler" daemon prio=10 tid=0x01007770 nid=0x814e00 in
Object.wait() [0xb0984000..0xb0984d90]
at java.lang.Object.wait(Native Method)
- waiting on <0x29a9da00> (a java.lang.ref.Reference$Lock)
at java.lang.Object.wait(Object.java:474)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)
- locked <0x29a9da00> (a java.lang.ref.Reference$Lock)
"main" prio=5 tid=0x01001670 nid=0xb0801000 waiting for monitor entry
[0xb07fe000..0xb0800148]
at org.apache.mina.statemachine.StateMachine.handle(StateMachine.java:
129)
- waiting to lock <0x29630390> (a
org.apache.mina.statemachine.context.DefaultStateContext)
at org.apache.mina.statemachine.StateMachineProxyBuilder
$MethodInvocationHandler.invoke(StateMachineProxyBuilder.java:253)
at $Proxy12.writeRequested(Unknown Source)
at
org
.neociclo
.netty
.statemachine
.DefaultStateMachineChannelHandler
.handleDownstream(DefaultStateMachineChannelHandler.java:111)
at
org
.neociclo
.netty
.statemachine
.ChannelAllCoverageWrapper
.handleDownstream(ChannelAllCoverageWrapper.java:49)
at
org
.jboss
.netty
.channel
.DefaultChannelPipeline.sendDownstream(DefaultChannelPipeline.java:590)
at org.jboss.netty.channel.DefaultChannelPipeline
$
DefaultChannelHandlerContext
.sendDownstream(DefaultChannelPipeline.java:796)
at
org
.neociclo
.netty
.statemachine
.SimpleStateMachineHandler.handleEvent(SimpleStateMachineHandler.java:
53)
at
org
.neociclo
.isdn
.netty
.handler
.LogicalConnectionHandler.unhandledEvent(LogicalConnectionHandler.java:
192)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun
.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:
39)
at
sun
.reflect
.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:
25)
at java.lang.reflect.Method.invoke(Method.java:585)
at
org
.apache
.mina
.statemachine
.transition.MethodTransition.invokeMethod(MethodTransition.java:272)
at
org
.apache
.mina
.statemachine
.transition.MethodTransition.doExecute(MethodTransition.java:229)
at
org
.apache
.mina
.statemachine
.transition.AbstractTransition.execute(AbstractTransition.java:73)
at org.apache.mina.statemachine.StateMachine.handle(StateMachine.java:
173)
at org.apache.mina.statemachine.StateMachine.handle(StateMachine.java:
263)
at
org
.apache.mina.statemachine.StateMachine.processEvents(StateMachine.java:
160)
at org.apache.mina.statemachine.StateMachine.handle(StateMachine.java:
147)
- locked <0x296300c0> (a
org.apache.mina.statemachine.context.DefaultStateContext)
at org.apache.mina.statemachine.StateMachineProxyBuilder
$MethodInvocationHandler.invoke(StateMachineProxyBuilder.java:253)
at $Proxy12.closeRequested(Unknown Source)
at
org
.neociclo
.netty
.statemachine
.DefaultStateMachineChannelHandler
.handleDownstream(DefaultStateMachineChannelHandler.java:117)
at
org
.neociclo
.netty
.statemachine
.ChannelAllCoverageWrapper
.handleDownstream(ChannelAllCoverageWrapper.java:49)
at
org
.jboss
.netty
.channel
.DefaultChannelPipeline.sendDownstream(DefaultChannelPipeline.java:590)
at
org
.jboss
.netty
.channel
.DefaultChannelPipeline.sendDownstream(DefaultChannelPipeline.java:585)
at org.jboss.netty.channel.Channels.close(Channels.java:1033)
at org.jboss.netty.channel.AbstractChannel.close(AbstractChannel.java:
185)
at
org
.neociclo
.isdn
.netty
.channel
.IsdnClientChannelTest
.testChannelConnectAndDisconnect(IsdnClientChannelTest.java:130)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun
.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:
39)
at
sun
.reflect
.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:
25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:59)
at
org
.junit.internal.runners.MethodRoadie.runTestMethod(MethodRoadie.java:98)
at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:79)
at
org
.junit
.internal
.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:87)
at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:
77)
at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:42)
at
org
.junit
.internal
.runners.JUnit4ClassRunner.invokeTestMethod(JUnit4ClassRunner.java:88)
at
org
.junit
.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:
51)
at org.junit.internal.runners.JUnit4ClassRunner
$1.run(JUnit4ClassRunner.java:44)
at
org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:
27)
at
org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37)
at
org
.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42)
at
org
.eclipse
.jdt
.internal
.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
at
org
.eclipse
.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at
org
.eclipse
.jdt
.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:
467)
at
org
.eclipse
.jdt
.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:
683)
at
org
.eclipse
.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:
390)
at
org
.eclipse
.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:
197)
"VM Thread" prio=9 tid=0x01006ed0 nid=0x814000 runnable
"VM Periodic Task Thread" prio=9 tid=0x01009db0 nid=0x806000 waiting
on condition
"Exception Catcher Thread" prio=10 tid=0x01001890 nid=0x80bc00 runnable
Found one Java-level deadlock:
=============================
"IsdnWorker(port 44237): id 937943, 55551111 => 55552222":
waiting to lock monitor 0x00815cb8 (object 0x296300c0, a
org.apache.mina.statemachine.context.DefaultStateContext),
which is held by "main"
"main":
waiting to lock monitor 0x00815c70 (object 0x29630390, a
org.apache.mina.statemachine.context.DefaultStateContext),
which is held by "IsdnWorker(port 44237): id 937943, 55551111 =>
55552222"
Java stack information for the threads listed above:
===================================================
"IsdnWorker(port 44237): id 937943, 55551111 => 55552222":
at org.apache.mina.statemachine.StateMachine.handle(StateMachine.java:
129)
- waiting to lock <0x296300c0> (a
org.apache.mina.statemachine.context.DefaultStateContext)
at org.apache.mina.statemachine.StateMachineProxyBuilder
$MethodInvocationHandler.invoke(StateMachineProxyBuilder.java:253)
at $Proxy12.writeComplete(Unknown Source)
at
org
.neociclo
.netty
.statemachine
.DefaultStateMachineChannelHandler
.handleUpstream(DefaultStateMachineChannelHandler.java:57)
at
org
.neociclo
.netty
.statemachine
.ChannelAllCoverageWrapper
.handleUpstream(ChannelAllCoverageWrapper.java:55)
at
org
.jboss
.netty
.channel
.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:567)
at org.jboss.netty.channel.DefaultChannelPipeline
$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:
803)
at
org
.neociclo
.netty
.statemachine
.SimpleStateMachineHandler.handleEvent(SimpleStateMachineHandler.java:
55)
at
org
.neociclo
.isdn
.netty
.handler.PhysicalLinkHandler.unhandledEvent(PhysicalLinkHandler.java:
193)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun
.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:
39)
at
sun
.reflect
.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:
25)
at java.lang.reflect.Method.invoke(Method.java:585)
at
org
.apache
.mina
.statemachine
.transition.MethodTransition.invokeMethod(MethodTransition.java:272)
at
org
.apache
.mina
.statemachine
.transition.MethodTransition.doExecute(MethodTransition.java:229)
at
org
.apache
.mina
.statemachine
.transition.AbstractTransition.execute(AbstractTransition.java:73)
at org.apache.mina.statemachine.StateMachine.handle(StateMachine.java:
173)
at org.apache.mina.statemachine.StateMachine.handle(StateMachine.java:
263)
at
org
.apache.mina.statemachine.StateMachine.processEvents(StateMachine.java:
160)
at org.apache.mina.statemachine.StateMachine.handle(StateMachine.java:
147)
- locked <0x29630390> (a
org.apache.mina.statemachine.context.DefaultStateContext)
at org.apache.mina.statemachine.StateMachineProxyBuilder
$MethodInvocationHandler.invoke(StateMachineProxyBuilder.java:253)
at $Proxy12.messageReceived(Unknown Source)
at
org
.neociclo
.netty
.statemachine
.DefaultStateMachineChannelHandler
.handleUpstream(DefaultStateMachineChannelHandler.java:54)
at
org
.neociclo
.netty
.statemachine
.ChannelAllCoverageWrapper
.handleUpstream(ChannelAllCoverageWrapper.java:55)
at
org
.jboss
.netty
.channel
.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:567)
at
org
.jboss
.netty
.channel
.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:562)
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:
342)
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:
329)
at org.neociclo.isdn.netty.channel.IsdnWorker.run(IsdnWorker.java:344)
at
org
.jboss
.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:113)
at
org
.jboss.netty.util.internal.IoWorkerRunnable.run(IoWorkerRunnable.java:
53)
at java.util.concurrent.ThreadPoolExecutor
$Worker.runTask(ThreadPoolExecutor.java:651)
at java.util.concurrent.ThreadPoolExecutor
$Worker.run(ThreadPoolExecutor.java:676)
at java.lang.Thread.run(Thread.java:613)
"main":
at org.apache.mina.statemachine.StateMachine.handle(StateMachine.java:
129)
- waiting to lock <0x29630390> (a
org.apache.mina.statemachine.context.DefaultStateContext)
at org.apache.mina.statemachine.StateMachineProxyBuilder
$MethodInvocationHandler.invoke(StateMachineProxyBuilder.java:253)
at $Proxy12.writeRequested(Unknown Source)
at
org
.neociclo
.netty
.statemachine
.DefaultStateMachineChannelHandler
.handleDownstream(DefaultStateMachineChannelHandler.java:111)
at
org
.neociclo
.netty
.statemachine
.ChannelAllCoverageWrapper
.handleDownstream(ChannelAllCoverageWrapper.java:49)
at
org
.jboss
.netty
.channel
.DefaultChannelPipeline.sendDownstream(DefaultChannelPipeline.java:590)
at org.jboss.netty.channel.DefaultChannelPipeline
$
DefaultChannelHandlerContext
.sendDownstream(DefaultChannelPipeline.java:796)
at
org
.neociclo
.netty
.statemachine
.SimpleStateMachineHandler.handleEvent(SimpleStateMachineHandler.java:
53)
at
org
.neociclo
.isdn
.netty
.handler
.LogicalConnectionHandler.unhandledEvent(LogicalConnectionHandler.java:
192)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun
.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:
39)
at
sun
.reflect
.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:
25)
at java.lang.reflect.Method.invoke(Method.java:585)
at
org
.apache
.mina
.statemachine
.transition.MethodTransition.invokeMethod(MethodTransition.java:272)
at
org
.apache
.mina
.statemachine
.transition.MethodTransition.doExecute(MethodTransition.java:229)
at
org
.apache
.mina
.statemachine
.transition.AbstractTransition.execute(AbstractTransition.java:73)
at org.apache.mina.statemachine.StateMachine.handle(StateMachine.java:
173)
at org.apache.mina.statemachine.StateMachine.handle(StateMachine.java:
263)
at
org
.apache.mina.statemachine.StateMachine.processEvents(StateMachine.java:
160)
at org.apache.mina.statemachine.StateMachine.handle(StateMachine.java:
147)
- locked <0x296300c0> (a
org.apache.mina.statemachine.context.DefaultStateContext)
at org.apache.mina.statemachine.StateMachineProxyBuilder
$MethodInvocationHandler.invoke(StateMachineProxyBuilder.java:253)
at $Proxy12.closeRequested(Unknown Source)
at
org
.neociclo
.netty
.statemachine
.DefaultStateMachineChannelHandler
.handleDownstream(DefaultStateMachineChannelHandler.java:117)
at
org
.neociclo
.netty
.statemachine
.ChannelAllCoverageWrapper
.handleDownstream(ChannelAllCoverageWrapper.java:49)
at
org
.jboss
.netty
.channel
.DefaultChannelPipeline.sendDownstream(DefaultChannelPipeline.java:590)
at
org
.jboss
.netty
.channel
.DefaultChannelPipeline.sendDownstream(DefaultChannelPipeline.java:585)
at org.jboss.netty.channel.Channels.close(Channels.java:1033)
at org.jboss.netty.channel.AbstractChannel.close(AbstractChannel.java:
185)
at
org
.neociclo
.isdn
.netty
.channel
.IsdnClientChannelTest
.testChannelConnectAndDisconnect(IsdnClientChannelTest.java:130)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun
.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:
39)
at
sun
.reflect
.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:
25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:59)
at
org
.junit.internal.runners.MethodRoadie.runTestMethod(MethodRoadie.java:98)
at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:79)
at
org
.junit
.internal
.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:87)
at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:
77)
at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:42)
at
org
.junit
.internal
.runners.JUnit4ClassRunner.invokeTestMethod(JUnit4ClassRunner.java:88)
at
org
.junit
.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:
51)
at org.junit.internal.runners.JUnit4ClassRunner
$1.run(JUnit4ClassRunner.java:44)
at
org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:
27)
at
org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37)
at
org
.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42)
at
org
.eclipse
.jdt
.internal
.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
at
org
.eclipse
.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at
org
.eclipse
.jdt
.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:
467)
at
org
.eclipse
.jdt
.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:
683)
at
org
.eclipse
.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:
390)
at
org
.eclipse
.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:
197)
Found 1 deadlock.