[
https://issues.apache.org/activemq/browse/AMQ-2054?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=48550#action_48550
]
Danielius Jurna commented on AMQ-2054:
--------------------------------------
I've added a patch to Usage class. All (3) synchronized statments in method
declarations were removed. In start and stop they are not necessary, because
those methods are guarded by atomic booleans. getExecutor() needs more care,
but I would prefere lock on usageMutex, because in order to prevent deadlocks,
you need as little mutexes as possible. Also mutex is used only on executor
initialisation. If it's already initialized, no locks are made.
> 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
> Attachments: Usage.java.patch
>
>
> 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.