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

ASF subversion and git services commented on AMQ-6660:
------------------------------------------------------

Commit dc786edeccb55cc16facb73b48466b3ef55263fa in activemq's branch 
refs/heads/activemq-5.16.x from Christopher L. Shannon (cshannon)
[ https://gitbox.apache.org/repos/asf?p=activemq.git;h=dc786ed ]

AMQ-6660 - Use a separate lock for lazy scheduler creation to prevent
deadlocks

Switch to using a dedicated lock to initialize the Scheduler object
inside of ActiveMQConnection to prevent a deadlock scenario that occurs
when using the intrinsic ActiveMQConnection lock. This is using double
checked locking so this lock will only be contended with during lazy
creation and then will rely on the volatile reference for future reads
and when stopping/closing.

(cherry picked from commit 3f5abd4433d3dca911ac418d899346e7dd675b7b)


> Deadlock closing a connection due to an exception
> -------------------------------------------------
>
>                 Key: AMQ-6660
>                 URL: https://issues.apache.org/jira/browse/AMQ-6660
>             Project: ActiveMQ
>          Issue Type: Bug
>    Affects Versions: 5.16.1
>            Reporter: Dan Groves
>            Assignee: Christopher L. Shannon
>            Priority: Major
>             Fix For: 5.17.0, 5.16.3
>
>
> While recovering from a period of network instability, our application 
> deadlocked in ActiveMQ code.
> {noformat}
> Found one Java-level deadlock:
> =============================
> "ActiveMQ Connection Executor: tcp:///<ip address>:61616@51026":
>   waiting to lock monitor 0x00007f60fc0060b8 (object 0x0000000773f00308, a 
> java.lang.Object),
>   which is held by "privateJmsInPriority.container-1"
> "privateJmsInPriority.container-1":
>   waiting to lock monitor 0x00007f610840dbc8 (object 0x0000000773f99930, a 
> org.apache.activemq.ActiveMQConnection),
>   which is held by "ActiveMQ Connection Executor: tcp:///<ip 
> address>:61616@51026"
> Java stack information for the threads listed above:
> ===================================================
> "ActiveMQ Connection Executor: tcp:///<ip address>:61616@51026":
>         at 
> org.apache.activemq.SimplePriorityMessageDispatchChannel.close(SimplePriorityMessageDispatchChannel.java:154)
>         - waiting to lock <0x0000000773f00308> (a java.lang.Object)
>         at 
> org.apache.activemq.ActiveMQMessageConsumer.dispose(ActiveMQMessageConsumer.java:800)
>         at 
> org.apache.activemq.ActiveMQSession.dispose(ActiveMQSession.java:689)
>         - locked <0x0000000773f003d8> (a org.apache.activemq.ActiveMQSession)
>         at 
> org.apache.activemq.ActiveMQConnection.close(ActiveMQConnection.java:659)
>         - locked <0x0000000773f99930> (a 
> org.apache.activemq.ActiveMQConnection)
>         at 
> org.springframework.jms.connection.SingleConnectionFactory.closeConnection(SingleConnectionFactory.java:456)
>         at 
> org.springframework.jms.connection.SingleConnectionFactory.resetConnection(SingleConnectionFactory.java:345)
>         - locked <0x0000000773f9a590> (a java.lang.Object)
>         at 
> org.springframework.jms.connection.CachingConnectionFactory.resetConnection(CachingConnectionFactory.java:207)
>         at 
> org.springframework.jms.connection.SingleConnectionFactory.onException(SingleConnectionFactory.java:323)
>         at 
> org.springframework.jms.connection.SingleConnectionFactory$AggregatedExceptionListener.onException(SingleConnectionFactory.java:673)
>         - locked <0x0000000773f9a590> (a java.lang.Object)
>         at 
> org.apache.activemq.ActiveMQConnection$5.run(ActiveMQConnection.java:1976)
>         at 
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
>         at 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
>         at java.lang.Thread.run(Thread.java:745)
> "privateJmsInPriority.container-1":
>         at 
> org.apache.activemq.ActiveMQConnection.getScheduler(ActiveMQConnection.java:2519)
>         - waiting to lock <0x0000000773f99930> (a 
> org.apache.activemq.ActiveMQConnection)
>         at 
> org.apache.activemq.ActiveMQSession.getScheduler(ActiveMQSession.java:2074)
>         at 
> org.apache.activemq.ActiveMQMessageConsumer.rollback(ActiveMQMessageConsumer.java:1241)
>         - locked <0x0000000773f01030> (a java.util.LinkedList)
>         - locked <0x0000000773f00308> (a java.lang.Object)
>         at 
> org.apache.activemq.ActiveMQMessageConsumer$5.afterRollback(ActiveMQMessageConsumer.java:1032)
>         at 
> org.apache.activemq.TransactionContext.afterRollback(TransactionContext.java:157)
>         at 
> org.apache.activemq.TransactionContext.commit(TransactionContext.java:332)
>         at 
> org.apache.activemq.ActiveMQSession.commit(ActiveMQSession.java:561)
>         at sun.reflect.GeneratedMethodAccessor897.invoke(Unknown Source)
>         at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>         at java.lang.reflect.Method.invoke(Method.java:498)
>         at 
> org.springframework.jms.connection.CachingConnectionFactory$CachedSessionInvocationHandler.invoke(CachingConnectionFactory.java:386)
>         at com.sun.proxy.$Proxy49.commit(Unknown Source)
>         at 
> org.springframework.jms.support.JmsUtils.commitIfNecessary(JmsUtils.java:217)
>         at 
> org.springframework.jms.listener.AbstractMessageListenerContainer.commitIfNecessary(AbstractMessageListenerContainer.java:761)
>         at 
> org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:665)
>         at 
> org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:319)
>         at 
> org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:257)
>         at 
> org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1166)
>         at 
> org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1158)
>         at 
> org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1055)
>         at java.lang.Thread.run(Thread.java:745)
> Found 1 deadlock.
> {noformat}



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to