[
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&wireFormat.maxFrameSize=104857600&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)