[ 
https://issues.apache.org/jira/browse/AMQ-7011?focusedWorklogId=345279&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-345279
 ]

ASF GitHub Bot logged work on AMQ-7011:
---------------------------------------

                Author: ASF GitHub Bot
            Created on: 18/Nov/19 13:13
            Start Date: 18/Nov/19 13:13
    Worklog Time Spent: 10m 
      Work Description: jgoodyear commented on issue #287: [AMQ-7011] Override 
dispatch to always set dispatchAsync true
URL: https://github.com/apache/activemq/pull/287#issuecomment-555009299
 
 
   Yes, we can close it.
   
   On Mon, Nov 18, 2019 at 1:19 AM Jean-Baptiste Onofré <
   [email protected]> wrote:
   
   > @jgoodyear <https://github.com/jgoodyear> according to the Jira, it seems
   > to have been merged already. Can you double check if we can close this PR ?
   > Thanks.
   >
   > —
   > You are receiving this because you were mentioned.
   > Reply to this email directly, view it on GitHub
   > 
<https://github.com/apache/activemq/pull/287?email_source=notifications&email_token=AADCKIMPTO5ONALK2PADX6DQUINFDA5CNFSM4FKBN4G2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOEEJFKDY#issuecomment-554849551>,
   > or unsubscribe
   > 
<https://github.com/notifications/unsubscribe-auth/AADCKILJCINTMVFMJ332CZLQUINFDANCNFSM4FKBN4GQ>
   > .
   >
   
 
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
[email protected]


Issue Time Tracking
-------------------

    Worklog Id:     (was: 345279)
    Time Spent: 20m  (was: 10m)

> Activemq 5.15.4 Stomp protocol allowed to enter deadlock via dispatch sync
> --------------------------------------------------------------------------
>
>                 Key: AMQ-7011
>                 URL: https://issues.apache.org/jira/browse/AMQ-7011
>             Project: ActiveMQ
>          Issue Type: Bug
>            Reporter: Jamie Mark Goodyear
>            Priority: Major
>             Fix For: 5.16.0, 5.15.5
>
>          Time Spent: 20m
>  Remaining Estimate: 0h
>
> Activemq 5.15.4 Stomp protocol allowed to enter deadlock via dispatch sync.
> Scenario:
> Stomp client setting the following:
> header.put("id", subId);
> header.put("activemq.dispatchAsync", "false");
> The setup of locks between TopicSubscription and MutexTransport while using 
> Stomp in sync mode can result in a Deadlock as found below (Add and Destroy 
> calls processing), each lock is identified by a + or * to show lock order in 
> each stack trace.
> 

Found one Java-level deadlock:
> =============================
> "ActiveMQ Transport: tcp:///127.0.0.1:58303@61613":
>   waiting to lock monitor 0x00007f9c565d4d28 (object 0x00000007acc44708, a 
> java.lang.Object),
>   which is held by "ActiveMQ Transport: tcp:///127.0.0.1:58302@61613"
> "ActiveMQ Transport: tcp:///127.0.0.1:58302@61613":
>   waiting for ownable synchronizer 0x00000007ac872730, (a 
> java.util.concurrent.locks.ReentrantLock$NonfairSync),
>   which is held by "ActiveMQ Transport: tcp:///127.0.0.1:58303@61613"
> Java stack information for the threads listed above:
> ===================================================
> "ActiveMQ Transport: tcp:///127.0.0.1:58303@61613":
> ++++++  at 
> org.apache.activemq.broker.region.TopicSubscription.destroy(TopicSubscription.java:757)
>     - waiting to lock <0x00000007acc44708> (a java.lang.Object)
>     at 
> org.apache.activemq.broker.region.AbstractRegion.destroySubscription(AbstractRegion.java:488)
>     at 
> org.apache.activemq.broker.jmx.ManagedTopicRegion.destroySubscription(ManagedTopicRegion.java:52)
>     at 
> org.apache.activemq.broker.region.AbstractRegion.removeConsumer(AbstractRegion.java:480)
>     at 
> org.apache.activemq.broker.region.TopicRegion.removeConsumer(TopicRegion.java:206)
>     at 
> org.apache.activemq.broker.region.RegionBroker.removeConsumer(RegionBroker.java:429)
>     at 
> org.apache.activemq.broker.jmx.ManagedRegionBroker.removeConsumer(ManagedRegionBroker.java:258)
>     at 
> org.apache.activemq.broker.BrokerFilter.removeConsumer(BrokerFilter.java:139)
>     at 
> org.apache.activemq.advisory.AdvisoryBroker.removeConsumer(AdvisoryBroker.java:352)
>     at 
> org.apache.activemq.broker.BrokerFilter.removeConsumer(BrokerFilter.java:139)
>     at 
> org.apache.activemq.broker.BrokerFilter.removeConsumer(BrokerFilter.java:139)
>     at 
> org.apache.activemq.broker.BrokerFilter.removeConsumer(BrokerFilter.java:139)
>     at 
> org.apache.activemq.broker.TransportConnection.processRemoveConsumer(TransportConnection.java:729)
>     at 
> org.apache.activemq.broker.TransportConnection.processRemoveSession(TransportConnection.java:768)
>     at 
> org.apache.activemq.broker.TransportConnection.processRemoveConnection(TransportConnection.java:879)
>     - locked <0x00000007ac999f00> (a 
> org.apache.activemq.broker.jmx.ManagedTransportConnection)
>     at org.apache.activemq.command.RemoveInfo.visit(RemoveInfo.java:73)
>     at 
> org.apache.activemq.broker.TransportConnection.service(TransportConnection.java:330)
>     at 
> org.apache.activemq.broker.TransportConnection$1.onCommand(TransportConnection.java:194)
> *****   at 
> org.apache.activemq.transport.MutexTransport.onCommand(MutexTransport.java:45)
>     at 
> org.apache.activemq.transport.AbstractInactivityMonitor.onCommand(AbstractInactivityMonitor.java:301)
>     at 
> org.apache.activemq.transport.stomp.StompTransportFilter.sendToActiveMQ(StompTransportFilter.java:97)
>     at 
> org.apache.activemq.transport.stomp.ProtocolConverter.sendToActiveMQ(ProtocolConverter.java:202)
>     at 
> org.apache.activemq.transport.stomp.ProtocolConverter.onStompDisconnect(ProtocolConverter.java:838)
>     at 
> org.apache.activemq.transport.stomp.ProtocolConverter.onStompCommand(ProtocolConverter.java:267)
>     at 
> org.apache.activemq.transport.stomp.StompTransportFilter.onCommand(StompTransportFilter.java:85)
>     at 
> org.apache.activemq.transport.TransportSupport.doConsume(TransportSupport.java:83)
>     at 
> org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:233)
>     at 
> org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:215)
>     at java.lang.Thread.run(Thread.java:748)
> "ActiveMQ Transport: tcp:///127.0.0.1:58302@61613":
>     at sun.misc.Unsafe.park(Native Method)
>     - parking to wait for  <0x00000007ac872730> (a 
> java.util.concurrent.locks.ReentrantLock$NonfairSync)
>     at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
>     at 
> java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
>     at 
> java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:870)
>     at 
> java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1199)
>     at 
> java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:209)
>     at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:285)
> *****   at 
> org.apache.activemq.transport.MutexTransport.oneway(MutexTransport.java:66)
>     at 
> org.apache.activemq.broker.TransportConnection.dispatch(TransportConnection.java:1486)
>     at 
> org.apache.activemq.broker.TransportConnection.processDispatch(TransportConnection.java:971)
>     at 
> org.apache.activemq.broker.TransportConnection.dispatchSync(TransportConnection.java:927)
>     at 
> org.apache.activemq.broker.region.TopicSubscription.dispatch(TopicSubscription.java:715)
> +++++   at 
> org.apache.activemq.broker.region.TopicSubscription.add(TopicSubscription.java:121)
>     - locked <0x00000007acc44708> (a java.lang.Object)
>     at 
> org.apache.activemq.broker.region.policy.SimpleDispatchPolicy.dispatch(SimpleDispatchPolicy.java:48)
>     at org.apache.activemq.broker.region.Topic.dispatch(Topic.java:775)
>     at org.apache.activemq.broker.region.Topic.doMessageSend(Topic.java:556)
>     - locked <0x00000007acbd4e08> (a org.apache.activemq.broker.region.Topic)
>     at org.apache.activemq.broker.region.Topic.send(Topic.java:484)
>     at 
> org.apache.activemq.broker.region.AbstractRegion.send(AbstractRegion.java:505)
>     at 
> org.apache.activemq.broker.region.RegionBroker.send(RegionBroker.java:459)
>     at 
> org.apache.activemq.broker.jmx.ManagedRegionBroker.send(ManagedRegionBroker.java:293)
>     at org.apache.activemq.broker.BrokerFilter.send(BrokerFilter.java:154)
>     at 
> org.apache.activemq.broker.CompositeDestinationBroker.send(CompositeDestinationBroker.java:96)
>     at 
> org.apache.activemq.broker.TransactionBroker.send(TransactionBroker.java:293)
>     at org.apache.activemq.broker.BrokerFilter.send(BrokerFilter.java:154)
>     at 
> org.apache.activemq.broker.TransportConnection.processMessage(TransportConnection.java:572)
>     at 
> org.apache.activemq.command.ActiveMQMessage.visit(ActiveMQMessage.java:768)
>     at 
> org.apache.activemq.broker.TransportConnection.service(TransportConnection.java:330)
>     at 
> org.apache.activemq.broker.TransportConnection$1.onCommand(TransportConnection.java:194)
>     at 
> org.apache.activemq.transport.MutexTransport.onCommand(MutexTransport.java:45)
>     at 
> org.apache.activemq.transport.AbstractInactivityMonitor.onCommand(AbstractInactivityMonitor.java:301)
>     at 
> org.apache.activemq.transport.stomp.StompTransportFilter.sendToActiveMQ(StompTransportFilter.java:97)
>     at 
> org.apache.activemq.transport.stomp.ProtocolConverter.sendToActiveMQ(ProtocolConverter.java:202)
>     at 
> org.apache.activemq.transport.stomp.ProtocolConverter.onStompSend(ProtocolConverter.java:345)
>     at 
> org.apache.activemq.transport.stomp.ProtocolConverter.onStompCommand(ProtocolConverter.java:248)
>     at 
> org.apache.activemq.transport.stomp.StompTransportFilter.onCommand(StompTransportFilter.java:85)
>     at 
> org.apache.activemq.transport.TransportSupport.doConsume(TransportSupport.java:83)
>     at 
> org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:233)
>     at 
> org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:215)
>     at java.lang.Thread.run(Thread.java:748)
> In reviewing how MQTT and AMQP were handled, both set 
> "consumerInfo.setDispatchAsync(true);"
> AMQPSession line 376
> MQTTDefualtSubscriptionStrategy line 61
> For MQTT fix see the below cards:
> ENTMQ-1504
> https://issues.jboss.org/browse/ENTMQ-1504?_sscc=t
> AMQ-5290
> https://issues.apache.org/jira/browse/AMQ-5290

> https://github.com/apache/activemq/blame/master/activemq-mqtt/src/main/java/org/apache/activemq/transport/mqtt/strategy/MQTTDefaultSubscriptionStrategy.java#L61
> 

> I believe we can fix this for Stomp in ProtocolConverter, line 614, by also 
> setting consumerInfo.setDispatchAsync(true); This would bring Stomp into 
> alignment with the other protocols and how they were fixed.
> I'll be providing a patch with the above change shortly.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to