You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@qpid.apache.org by "Rajith Attapattu (JIRA)" <ji...@apache.org> on 2011/05/03 16:32:03 UTC

[jira] [Commented] (QPID-3214) Deadlock between the failover mutex (in AMQConnection.java) and the current_exception_lock (in AMQSession.java)

    [ https://issues.apache.org/jira/browse/QPID-3214?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13028247#comment-13028247 ] 

Rajith Attapattu commented on QPID-3214:
----------------------------------------

Committed Gordon's suggested fix.
It seems for some situations the exception listener is the only way to get notified about a session exception.
However there was a bug which prevented exceptions being notified in some cases(see QPID-3233) and has since been fixed.
Therefore I believe Gordon's suggestion is probably the correct way to go.

> Deadlock between the failover mutex (in AMQConnection.java) and the current_exception_lock (in AMQSession.java)
> ---------------------------------------------------------------------------------------------------------------
>
>                 Key: QPID-3214
>                 URL: https://issues.apache.org/jira/browse/QPID-3214
>             Project: Qpid
>          Issue Type: Bug
>          Components: Java Client
>    Affects Versions: 0.10
>            Reporter: Rajith Attapattu
>            Assignee: Rajith Attapattu
>            Priority: Critical
>             Fix For: 0.11
>
>         Attachments: QPID-3214.patch
>
>
> As per the following thread dump you can clearly see the deadlock between the failover mutex in AMQConnection.java and the current_exception_lock in AMQSession.java
> This is a regression and was introduced in rev 985262
>   Found one Java-level deadlock:
>   =============================
>   "IoReceiver - localhost/127.0.0.1:15672":
>     waiting to lock monitor 0x0000002ac2ea3b70 (object 0x0000002ab70156b0, a java.lang.Object),
>     which is held by "main"
>   "main":
>     waiting to lock monitor 0x0000002ac28db1b8 (object 0x0000002ab7048d70, a java.lang.Object),
>     which is held by "IoReceiver - localhost/127.0.0.1:15672"
>   Java stack information for the threads listed above:
>   ===================================================
>   "IoReceiver - localhost/127.0.0.1:15672":
>      at org.apache.qpid.client.AMQConnection.exceptionReceived(AMQConnection.java:1297)
>      - waiting to lock<0x0000002ab70156b0>  (a java.lang.Object)
>      at org.apache.qpid.client.AMQSession_0_10.setCurrentException(AMQSession_0_10.java:1033)
>      - locked<0x0000002ab7048d70>  (a java.lang.Object)
>      at org.apache.qpid.client.AMQSession_0_10.exception(AMQSession_0_10.java:913)
>      at org.apache.qpid.transport.SessionDelegate.executionException(SessionDelegate.java:156)
>      at org.apache.qpid.transport.SessionDelegate.executionException(SessionDelegate.java:32)
>      at org.apache.qpid.transport.ExecutionException.dispatch(ExecutionException.java:112)
>      at org.apache.qpid.transport.SessionDelegate.command(SessionDelegate.java:50)
>      at org.apache.qpid.transport.SessionDelegate.command(SessionDelegate.java:32)
>      at org.apache.qpid.transport.Method.delegate(Method.java:159)
>      at org.apache.qpid.transport.Session.received(Session.java:528)
>      at org.apache.qpid.transport.Connection.dispatch(Connection.java:404)
>      at org.apache.qpid.transport.ConnectionDelegate.handle(ConnectionDelegate.java:64)
>      at org.apache.qpid.transport.ConnectionDelegate.handle(ConnectionDelegate.java:40)
>      at org.apache.qpid.transport.MethodDelegate.executionException(MethodDelegate.java:110)
>      at org.apache.qpid.transport.ExecutionException.dispatch(ExecutionException.java:112)
>      at org.apache.qpid.transport.ConnectionDelegate.command(ConnectionDelegate.java:54)
>      at org.apache.qpid.transport.ConnectionDelegate.command(ConnectionDelegate.java:40)
>      at org.apache.qpid.transport.Method.delegate(Method.java:159)
>      at org.apache.qpid.transport.Connection.received(Connection.java:369)
>      at org.apache.qpid.transport.Connection.received(Connection.java:59)
>      at org.apache.qpid.transport.network.Assembler.emit(Assembler.java:95)
>      at org.apache.qpid.transport.network.Assembler.assemble(Assembler.java:196)
>      at org.apache.qpid.transport.network.Assembler.frame(Assembler.java:129)
>      at org.apache.qpid.transport.network.Frame.delegate(Frame.java:133)
>      at org.apache.qpid.transport.network.Assembler.received(Assembler.java:100)
>      at org.apache.qpid.transport.network.Assembler.received(Assembler.java:42)
>      at org.apache.qpid.transport.network.InputHandler.next(InputHandler.java:187)
>      at org.apache.qpid.transport.network.InputHandler.received(InputHandler.java:103)
>      at org.apache.qpid.transport.network.InputHandler.received(InputHandler.java:42)
>      at org.apache.qpid.transport.network.io.IoReceiver.run(IoReceiver.java:128)
>      at java.lang.Thread.run(Thread.java:619)
>   "main":
>      at org.apache.qpid.client.AMQSession_0_10.setCurrentException(AMQSession_0_10.java:1025)
>      - waiting to lock<0x0000002ab7048d70>  (a java.lang.Object)
>      at org.apache.qpid.client.BasicMessageConsumer_0_10.sendCancel(BasicMessageConsumer_0_10.java:193)
>      at org.apache.qpid.client.BasicMessageConsumer.close(BasicMessageConsumer.java:573)
>      - locked<0x0000002ab70156b0>  (a java.lang.Object)
>      at org.apache.qpid.client.BasicMessageConsumer.close(BasicMessageConsumer.java:535)
>      at org.apache.qpid.client.AMQQueueBrowser.close(AMQQueueBrowser.java:102)
>      at org.apache.qpid.test.client.QueueBrowserAutoAckTest.testFailoverWithQueueBrowser(QueueBrowserAutoAckTest.java:501)
>      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:597)
>      at junit.framework.TestCase.runTest(TestCase.java:154)
>      at junit.framework.TestCase.runBare(TestCase.java:127)
>      at org.apache.qpid.test.utils.QpidBrokerTestCase.runBare(QpidBrokerTestCase.java:234)
>      at junit.framework.TestResult$1.protect(TestResult.java:106)
>      at junit.framework.TestResult.runProtected(TestResult.java:124)
>      at junit.framework.TestResult.run(TestResult.java:109)
>      at junit.framework.TestCase.run(TestCase.java:118)
>      at org.apache.qpid.test.utils.QpidTestCase.run(QpidTestCase.java:120)
>      at junit.framework.TestSuite.runTest(TestSuite.java:208)
>      at junit.framework.TestSuite.run(TestSuite.java:203)
>      at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:297)
>      at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:672)
>      at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:546)
>   Found 1 deadlock

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:dev-subscribe@qpid.apache.org