Deadlock in org.apache.activemq.usage.Usage
-------------------------------------------
Key: AMQ-2054
URL: https://issues.apache.org/activemq/browse/AMQ-2054
Project: ActiveMQ
Issue Type: Bug
Components: Broker
Affects Versions: 5.2.0
Reporter: Danielius Jurna
Priority: Critical
In highly concurrent environment, client deadlocks with this stack trace.
Obiously, there are too many synchronized statements in Usage class. Either you
add statements on method declaration, or use synchronized on mutex object. Now
for example stop method is declared as synchronized and also locks usageMutex
and this causes deadlock.
Found one Java-level deadlock:
=============================
"jmsConnector.dispatcher.486":
waiting to lock monitor 0x08528fb0 (object 0xa4b01390, a java.lang.Object),
which is held by "ActiveMQ Transport: tcp://localhost/127.0.0.1:61616"
"ActiveMQ Transport: tcp://localhost/127.0.0.1:61616":
waiting to lock monitor 0x08528a38 (object 0xa4b01348, a
org.apache.activemq.usage.MemoryUsage),
which is held by "jmsConnector.dispatcher.486"
Java stack information for the threads listed above:
===================================================
"jmsConnector.dispatcher.486":
at org.apache.activemq.usage.Usage.stop(Usage.java:306)
- waiting to lock <0xa4b01390> (a java.lang.Object)
- locked <0xa4b01348> (a org.apache.activemq.usage.MemoryUsage)
at
org.apache.activemq.ActiveMQMessageProducer.dispose(ActiveMQMessageProducer.java:156)
at org.apache.activemq.ActiveMQSession.dispose(ActiveMQSession.java:589)
- locked <0xa4b091d8> (a org.apache.activemq.ActiveMQSession)
at org.apache.activemq.ActiveMQSession.close(ActiveMQSession.java:555)
at
org.apache.activemq.pool.SessionPool.destroyObject(SessionPool.java:81)
at
org.apache.commons.pool.impl.GenericObjectPool.addObjectToPool(GenericObjectPool.java:1128)
at
org.apache.commons.pool.impl.GenericObjectPool.returnObject(GenericObjectPool.java:1076)
at
org.apache.activemq.pool.SessionPool.returnSession(SessionPool.java:67)
at org.apache.activemq.pool.PooledSession.close(PooledSession.java:124)
at org.mule.providers.jms.JmsConnector.close(JmsConnector.java:1003)
at
org.mule.providers.jms.JmsConnector.closeQuietly(JmsConnector.java:1017)
at
org.mule.providers.jms.JmsMessageDispatcher.dispatchMessage(JmsMessageDispatcher.java:323)
at
org.mule.providers.jms.JmsMessageDispatcher.doDispatch(JmsMessageDispatcher.java:64)
at
org.mule.providers.AbstractMessageDispatcher$Worker.run(AbstractMessageDispatcher.java:561)
at org.mule.impl.work.WorkerContext.run(WorkerContext.java:310)
at
edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:987)
at
edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:528)
at java.lang.Thread.run(Thread.java:619)
"ActiveMQ Transport: tcp://localhost/127.0.0.1:61616":
at org.apache.activemq.usage.Usage.getExecutor(Usage.java:404)
- waiting to lock <0xa4b01348> (a org.apache.activemq.usage.MemoryUsage)
at org.apache.activemq.usage.Usage.fireEvent(Usage.java:271)
at org.apache.activemq.usage.Usage.setPercentUsage(Usage.java:232)
- locked <0xa4b01390> (a java.lang.Object)
at
org.apache.activemq.usage.MemoryUsage.decreaseUsage(MemoryUsage.java:146)
at
org.apache.activemq.ActiveMQMessageProducer.onProducerAck(ActiveMQMessageProducer.java:289)
at
org.apache.activemq.ActiveMQConnection$2.processProducerAck(ActiveMQConnection.java:1675)
at org.apache.activemq.command.ProducerAck.visit(ProducerAck.java:56)
at
org.apache.activemq.ActiveMQConnection.onCommand(ActiveMQConnection.java:1647)
at
org.apache.activemq.transport.ResponseCorrelator.onCommand(ResponseCorrelator.java:104)
at
org.apache.activemq.transport.TransportFilter.onCommand(TransportFilter.java:68)
at
org.apache.activemq.transport.failover.FailoverTransport$3.onCommand(FailoverTransport.java:167)
at
org.apache.activemq.transport.WireFormatNegotiator.onCommand(WireFormatNegotiator.java:143)
at
org.apache.activemq.transport.InactivityMonitor.onCommand(InactivityMonitor.java:206)
- locked <0x752c53e8> (a
org.apache.activemq.transport.InactivityMonitor$1)
at
org.apache.activemq.transport.TransportSupport.doConsume(TransportSupport.java:84)
at
org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:203)
at
org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:185)
at java.lang.Thread.run(Thread.java:619)
Found 1 deadlock.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.