You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@activemq.apache.org by "Timothy Bish (JIRA)" <ji...@apache.org> on 2013/07/08 22:01:50 UTC
[jira] [Closed] (AMQ-4561) Deadlock in
DemandForwardingBridgeSupport class if ConsumerInfo message has arrived
before BrokerInfo message.
[ https://issues.apache.org/jira/browse/AMQ-4561?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Timothy Bish closed AMQ-4561.
-----------------------------
Resolution: Incomplete
No test case to validate on current version.
> Deadlock in DemandForwardingBridgeSupport class if ConsumerInfo message has arrived before BrokerInfo message.
> --------------------------------------------------------------------------------------------------------------
>
> Key: AMQ-4561
> URL: https://issues.apache.org/jira/browse/AMQ-4561
> Project: ActiveMQ
> Issue Type: Bug
> Components: Broker
> Affects Versions: 5.6.0, 5.7.0
> Reporter: Yuriy Sidelnikov
> Labels: broker, deadlock
> Attachments: patch.diff
>
>
> To establish a connection a spoke broker sends some special messages to the hub:
> • BrokerInfo
> • ConnectionInfo
> • SessionInfo
> • ProducerInfo
> • ConsumerInfo
> In return hub gsends exactly the same set of messages:
> • BrokerInfo
> • ConnectionInfo
> • SessionInfo
> • ProducerInfo
> • ConsumerInfo
>
> All messages are sent asynchronously so message order is not guaranteed.
>
> However BrokerInfo message has to be delivered BEFORE ConsumerInfo message to the spoke broker because:
> 1. ConsumerInfo processing logic is depended on some information provided in BrokerInfo message so spoke broker side has lock on it.
> 2. All incoming messages are processed in the same thread including reading from tcp/nio stream.
> Short excerpt from DemandForwardingBridgeSupport class:
> private void startLocalBridge() throws Throwable { BrokerInfo message processing
> …..
> localStartedLatch.countDown();
> }
> And ConsumerInfo message processing part has the lock:
> case ConsumerInfo.DATA_STRUCTURE_TYPE:
> localStartedLatch.await();
> So if ConsumerInfo message has been received before BrokerInfo message the consuming thread will be in dead lock:
> Name: ActiveMQ NIO Worker 13
> State: WAITING on java.util.concurrent.CountDownLatch$Sync@150b06b
> Total blocked: 1 Total waited: 3
> Stack trace:
> sun.misc.Unsafe.park(Native Method)
> java.util.concurrent.locks.LockSupport.park(LockSupport.java:156)
> java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:811)
> java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:969)
> java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1281)
> java.util.concurrent.CountDownLatch.await(CountDownLatch.java:207)
> org.apache.activemq.network.DemandForwardingBridgeSupport.serviceRemoteCommand(DemandForwardingBridgeSupport.java:534)
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira