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

Gary Tully commented on AMQ-7115:
---------------------------------

The serviceRead with the start lock held can only occur if it wins the race 
with the async serviceRead introduced via: AMQ-6414 - however it should never 
be servicing the error twice.

> Deadlock between MQTTInactivityMonitor and BrokerService Threads
> ----------------------------------------------------------------
>
>                 Key: AMQ-7115
>                 URL: https://issues.apache.org/jira/browse/AMQ-7115
>             Project: ActiveMQ
>          Issue Type: Bug
>          Components: MQTT
>    Affects Versions: 5.15.0
>         Environment: {code}
> <transportConnector name="mqtt+nio+ssl" 
> uri="mqtt+nio+ssl://0.0.0.0:62062?maximumConnections=200000&amp;wireFormat.maxFrameSize=104857600&amp;transport.subscriptionStrategy=mqtt-virtual-topic-subscriptions"/>
>  {code}
>            Reporter: Gary Tully
>            Assignee: Gary Tully
>            Priority: Major
>             Fix For: 5.16.0
>
>
> MQTT with nio+ssl, thread dead lock on concurrent processing socket read 
> error and inactivity monitor exception.
> {code}Found one Java-level deadlock:
> =============================
> "MQTTInactivityMonitor Async Task: 
> java.util.concurrent.ThreadPoolExecutor$Worker@7e51223f[State = -1, empty 
> queue]":
>  waiting to lock monitor 0x00007fd54c06d268 (object 0x00000003f63c3d50, a 
> org.apache.activemq.broker.jmx.ManagedTransportConnection),
>  which is held by "ActiveMQ BrokerService[AMQ2] Task-38733"
> "ActiveMQ BrokerService[AMQ2] Task-38733":
>  waiting for ownable synchronizer 0x0000000436d5d458, (a 
> java.util.concurrent.locks.ReentrantLock$NonfairSync),
>  which is held by "MQTTInactivityMonitor Async Task: 
> java.util.concurrent.ThreadPoolExecutor$Worker@7e51223f[State = -1, empty 
> queue]"
> Java stack information for the threads listed above:
> ===================================================
> "MQTTInactivityMonitor Async Task: 
> java.util.concurrent.ThreadPoolExecutor$Worker@7e51223f[State = -1, empty 
> queue]":
>  at 
> org.apache.activemq.broker.TransportConnection.processRemoveConnection(TransportConnection.java:870)
>  - waiting to lock <0x00000003f63c3d50> (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:326)
>  at 
> org.apache.activemq.broker.TransportConnection$1.onCommand(TransportConnection.java:190)
>  at 
> org.apache.activemq.transport.MutexTransport.onCommand(MutexTransport.java:45)
>  at 
> org.apache.activemq.transport.mqtt.MQTTInactivityMonitor.onCommand(MQTTInactivityMonitor.java:162)
>  at 
> org.apache.activemq.transport.mqtt.MQTTTransportFilter.sendToActiveMQ(MQTTTransportFilter.java:106)
>  at 
> org.apache.activemq.transport.mqtt.MQTTProtocolConverter.sendToActiveMQ(MQTTProtocolConverter.java:181)
>  at 
> org.apache.activemq.transport.mqtt.MQTTProtocolConverter.onTransportError(MQTTProtocolConverter.java:650)
>  at 
> org.apache.activemq.transport.mqtt.MQTTInactivityMonitor.onException(MQTTInactivityMonitor.java:194)
>  at 
> org.apache.activemq.transport.mqtt.MQTTInactivityMonitor$2$1.run(MQTTInactivityMonitor.java:128)
>  at 
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
>  at 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
>  at java.lang.Thread.run(Thread.java:748)
> "ActiveMQ BrokerService[AMQ2] Task-38733":
>  at sun.misc.Unsafe.park(Native Method)
>  - parking to wait for <0x0000000436d5d458> (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.onCommand(MutexTransport.java:43)
>  at 
> org.apache.activemq.transport.mqtt.MQTTInactivityMonitor.onCommand(MQTTInactivityMonitor.java:162)
>  at 
> org.apache.activemq.transport.mqtt.MQTTTransportFilter.sendToActiveMQ(MQTTTransportFilter.java:106)
>  at 
> org.apache.activemq.transport.mqtt.MQTTProtocolConverter.sendToActiveMQ(MQTTProtocolConverter.java:181)
>  at 
> org.apache.activemq.transport.mqtt.MQTTProtocolConverter.onTransportError(MQTTProtocolConverter.java:650)
>  at 
> org.apache.activemq.transport.mqtt.MQTTTransportFilter.onException(MQTTTransportFilter.java:206)
>  at 
> org.apache.activemq.transport.TransportSupport.onException(TransportSupport.java:96)
>  at 
> org.apache.activemq.transport.nio.NIOSSLTransport.serviceRead(NIOSSLTransport.java:225)
>  at 
> org.apache.activemq.transport.mqtt.MQTTNIOSSLTransport.initializeStreams(MQTTNIOSSLTransport.java:48)
>  at 
> org.apache.activemq.transport.tcp.TcpTransport.connect(TcpTransport.java:519)
>  at 
> org.apache.activemq.transport.nio.NIOTransport.doStart(NIOTransport.java:160)
>  at 
> org.apache.activemq.transport.nio.NIOSSLTransport.doStart(NIOSSLTransport.java:412)
>  at org.apache.activemq.util.ServiceSupport.start(ServiceSupport.java:55)
>  at 
> org.apache.activemq.transport.TransportFilter.start(TransportFilter.java:58)
>  at 
> org.apache.activemq.transport.mqtt.MQTTTransportFilter.start(MQTTTransportFilter.java:157)
>  at 
> org.apache.activemq.transport.mqtt.MQTTInactivityMonitor.start(MQTTInactivityMonitor.java:148)
>  at 
> org.apache.activemq.transport.TransportFilter.start(TransportFilter.java:58)
>  at 
> org.apache.activemq.broker.TransportConnection.start(TransportConnection.java:1066)
>  - locked <0x00000003f63c3d50> (a 
> org.apache.activemq.broker.jmx.ManagedTransportConnection)
>  at 
> org.apache.activemq.broker.TransportConnector$1$1.run(TransportConnector.java:218)
>  at 
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
>  at 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
>  at java.lang.Thread.run(Thread.java:748)\{code}
> {code}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to