[jira] [Assigned] (QPID-5050) Clients calling Connection#stop() from within an ExceptionListener have potential for deadlock
[ https://issues.apache.org/jira/browse/QPID-5050?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ] Philip Harvey reassigned QPID-5050: --- Assignee: Keith Wall (was: Philip Harvey) Reviewed - see previous comment Clients calling Connection#stop() from within an ExceptionListener have potential for deadlock -- Key: QPID-5050 URL: https://issues.apache.org/jira/browse/QPID-5050 Project: Qpid Issue Type: Bug Components: Java Client Affects Versions: 0.8, 0.10, 0.12, 0.14, 0.16, 0.18, 0.20, 0.22 Reporter: Keith Wall Assignee: Keith Wall Attachments: 0001-QPID-5050-Move-invocation-of-ExceptionListener-to-af.patch A deadlock possibility exists for client applications calling Connection#stop within an application owned ExceptionListener. Unfortunately a common messaging framework (Spring), installs such a ExceptionListener. In a recent support call, such a deadlock had occurred between the dispatcher thread (whose onMessage was in the process of creating a session) and a pooled thread bouncing a message back to the application. (The bounced messages is returned to the application via the exception listener). The deadlock involves the Dispatcher._lock and AMQConnection._failoverMutex. The deadlock was reproduced with a system test (attached to Jira) and deadlock captured with jstack -l pid (output below). {noformat} Dispatcher-1-Conn-4 pool-8-thread-1 + acquires c888 (Dispatcher#_lock)+ acquires ca68 (AMQConnection#_failoverMutex) + tries to acquire ca68 + tries to acquire c888 {noformat} {noformat} Found one Java-level deadlock: = pool-8-thread-1: waiting to lock monitor 0x5b0d3560 (object 0xf70bc888, a java.lang.Object), which is held by Dispatcher-1-Conn-4 Dispatcher-1-Conn-4: waiting to lock monitor 0x5b187308 (object 0xf70bca68, a java.lang.Object), which is held by pool-8-thread-1 Java stack information for the threads listed above: === pool-8-thread-1: at org.apache.qpid.client.AMQSession$Dispatcher.setConnectionStopped(AMQSession.java:3276) - waiting to lock 0xf70bc888 (a java.lang.Object) at org.apache.qpid.client.AMQSession.stop(AMQSession.java:2382) at org.apache.qpid.client.AMQConnection.stop(AMQConnection.java:835) at org.apache.qpid.test.unit.client.connection.ExceptionListenerTest$4.onException(ExceptionListenerTest.java:206) at org.apache.qpid.client.AMQConnection.exceptionReceived(AMQConnection.java:1329) - locked 0xf70bca68 (a java.lang.Object) at org.apache.qpid.client.AMQSession_0_8$4.run(AMQSession_0_8.java:600) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:662) Dispatcher-1-Conn-4: at org.apache.qpid.client.AMQConnectionDelegate_8_0.executeRetrySupport(AMQConnectionDelegate_8_0.java:333) - waiting to lock 0xf70bca68 (a java.lang.Object) at org.apache.qpid.client.AMQConnection.executeRetrySupport(AMQConnection.java:624) at org.apache.qpid.client.failover.FailoverRetrySupport.execute(FailoverRetrySupport.java:102) at org.apache.qpid.client.AMQSession.createProducerImpl(AMQSession.java:2600) at org.apache.qpid.client.AMQSession.createProducer(AMQSession.java:1176) at org.apache.qpid.client.AMQSession.createProducer(AMQSession.java:98) at org.apache.qpid.test.unit.client.connection.ExceptionListenerTest$5.onMessage(ExceptionListenerTest.java:229) at org.apache.qpid.client.BasicMessageConsumer.notifyMessage(BasicMessageConsumer.java:744) at org.apache.qpid.client.BasicMessageConsumer.notifyMessage(BasicMessageConsumer.java:718) at org.apache.qpid.client.AMQSession$Dispatcher.notifyConsumer(AMQSession.java:3388) at org.apache.qpid.client.AMQSession$Dispatcher.dispatchMessage(AMQSession.java:3327) - locked 0xf71747e0 (a java.lang.Object) - locked 0xf70bc888 (a java.lang.Object) at org.apache.qpid.client.AMQSession$Dispatcher.access$900(AMQSession.java:3114) at org.apache.qpid.client.AMQSession.dispatch(AMQSession.java:3107) at org.apache.qpid.client.message.UnprocessedMessage.dispatch(UnprocessedMessage.java:54) at org.apache.qpid.client.AMQSession$Dispatcher.run(AMQSession.java:3250) at java.lang.Thread.run(Thread.java:662)
[jira] [Assigned] (QPID-5050) Clients calling Connection#stop() from within an ExceptionListener have potential for deadlock
[ https://issues.apache.org/jira/browse/QPID-5050?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ] Keith Wall reassigned QPID-5050: Assignee: Keith Wall Clients calling Connection#stop() from within an ExceptionListener have potential for deadlock -- Key: QPID-5050 URL: https://issues.apache.org/jira/browse/QPID-5050 Project: Qpid Issue Type: Bug Components: Java Client Affects Versions: 0.8, 0.10, 0.12, 0.14, 0.16, 0.18, 0.20, 0.22 Reporter: Keith Wall Assignee: Keith Wall A deadlock possibility exists for client applications calling Connection#stop within an application owned ExceptionListener. Unfortunately a common messaging framework (Spring), installs such a ExceptionListener. In a recent support call, such a deadlock had occurred between the dispatcher thread (whose onMessage was in the process of creating a session) and a pooled thread bouncing a message back to the application. (The bounced messages is returned to the application via the exception listener). The deadlock involves the Dispatcher._lock and AMQConnection._failoverMutex. The deadlock was reproduced with a system test (attached to Jira) and deadlock captured with jstack -l pid (output below). {noformat} Dispatcher-1-Conn-4 pool-8-thread-1 + acquires c888 (Dispatcher#_lock)+ acquires ca68 (AMQConnection#_failoverMutex) + tries to acquire ca68 + tries to acquire c888 {noformat} {noformat} Found one Java-level deadlock: = pool-8-thread-1: waiting to lock monitor 0x5b0d3560 (object 0xf70bc888, a java.lang.Object), which is held by Dispatcher-1-Conn-4 Dispatcher-1-Conn-4: waiting to lock monitor 0x5b187308 (object 0xf70bca68, a java.lang.Object), which is held by pool-8-thread-1 Java stack information for the threads listed above: === pool-8-thread-1: at org.apache.qpid.client.AMQSession$Dispatcher.setConnectionStopped(AMQSession.java:3276) - waiting to lock 0xf70bc888 (a java.lang.Object) at org.apache.qpid.client.AMQSession.stop(AMQSession.java:2382) at org.apache.qpid.client.AMQConnection.stop(AMQConnection.java:835) at org.apache.qpid.test.unit.client.connection.ExceptionListenerTest$4.onException(ExceptionListenerTest.java:206) at org.apache.qpid.client.AMQConnection.exceptionReceived(AMQConnection.java:1329) - locked 0xf70bca68 (a java.lang.Object) at org.apache.qpid.client.AMQSession_0_8$4.run(AMQSession_0_8.java:600) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:662) Dispatcher-1-Conn-4: at org.apache.qpid.client.AMQConnectionDelegate_8_0.executeRetrySupport(AMQConnectionDelegate_8_0.java:333) - waiting to lock 0xf70bca68 (a java.lang.Object) at org.apache.qpid.client.AMQConnection.executeRetrySupport(AMQConnection.java:624) at org.apache.qpid.client.failover.FailoverRetrySupport.execute(FailoverRetrySupport.java:102) at org.apache.qpid.client.AMQSession.createProducerImpl(AMQSession.java:2600) at org.apache.qpid.client.AMQSession.createProducer(AMQSession.java:1176) at org.apache.qpid.client.AMQSession.createProducer(AMQSession.java:98) at org.apache.qpid.test.unit.client.connection.ExceptionListenerTest$5.onMessage(ExceptionListenerTest.java:229) at org.apache.qpid.client.BasicMessageConsumer.notifyMessage(BasicMessageConsumer.java:744) at org.apache.qpid.client.BasicMessageConsumer.notifyMessage(BasicMessageConsumer.java:718) at org.apache.qpid.client.AMQSession$Dispatcher.notifyConsumer(AMQSession.java:3388) at org.apache.qpid.client.AMQSession$Dispatcher.dispatchMessage(AMQSession.java:3327) - locked 0xf71747e0 (a java.lang.Object) - locked 0xf70bc888 (a java.lang.Object) at org.apache.qpid.client.AMQSession$Dispatcher.access$900(AMQSession.java:3114) at org.apache.qpid.client.AMQSession.dispatch(AMQSession.java:3107) at org.apache.qpid.client.message.UnprocessedMessage.dispatch(UnprocessedMessage.java:54) at org.apache.qpid.client.AMQSession$Dispatcher.run(AMQSession.java:3250) at java.lang.Thread.run(Thread.java:662) Found 1 deadlock. {noformat} -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators