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.

Reply via email to