You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@activemq.apache.org by "yangwei (JIRA)" <ji...@apache.org> on 2018/12/21 04:14:00 UTC

[jira] [Created] (ARTEMIS-2209) Fix deadlock while getting queue message count during cleanup

yangwei created ARTEMIS-2209:
--------------------------------

             Summary: Fix deadlock while getting queue message count during cleanup
                 Key: ARTEMIS-2209
                 URL: https://issues.apache.org/jira/browse/ARTEMIS-2209
             Project: ActiveMQ Artemis
          Issue Type: Bug
          Components: Broker
            Reporter: yangwei


ARTEMIS-2123 introduced a deadlock bug.

jstack shows:

Thread 1:

at java.util.concurrent.locks.ReentrantReadWriteLock$ReadLock.lock(ReentrantReadWriteLock.java:727)
 at org.apache.activemq.artemis.core.paging.impl.PagingStoreImpl.startPaging(PagingStoreImpl.java:481)
 at org.apache.activemq.artemis.core.paging.impl.PagingStoreImpl.addSize(PagingStoreImpl.java:739)
 at org.apache.activemq.artemis.core.paging.impl.PagingStoreImpl.nonDurableUp(PagingStoreImpl.java:952)
 at org.apache.activemq.artemis.api.core.RefCountMessage.incrementRefCount(RefCountMessage.java:50)
 at org.apache.activemq.artemis.core.persistence.impl.journal.LargeServerMessageImpl.incrementDelayDeletionCount(LargeServerMessageImpl.java:149)
 - locked org.apache.activemq.artemis.core.persistence.impl.journal.LargeServerMessageImpl@67359741
 at org.apache.activemq.artemis.core.server.impl.ServerConsumerImpl$LargeMessageDeliverer.<init>(ServerConsumerImpl.java:1171)
 at org.apache.activemq.artemis.core.server.impl.ServerConsumerImpl$LargeMessageDeliverer.<init>(ServerConsumerImpl.java:1151)
 at org.apache.activemq.artemis.core.server.impl.ServerConsumerImpl.handle(ServerConsumerImpl.java:431)
 - locked java.lang.Object@3f31a7b3
 at org.apache.activemq.artemis.core.server.impl.QueueImpl.handle(QueueImpl.java:2809)
 at org.apache.activemq.artemis.core.server.impl.QueueImpl.deliver(QueueImpl.java:2196)
 - locked org.apache.activemq.artemis.core.server.impl.QueueImpl@6c2bd0dc
 at org.apache.activemq.artemis.core.server.impl.QueueImpl.access$1900(QueueImpl.java:105)
 at org.apache.activemq.artemis.core.server.impl.QueueImpl$DeliverRunner.run(QueueImpl.java:3001)
 - locked org.apache.activemq.artemis.core.server.impl.QueueImpl$DeliverRunner@79dea1f9

Thread 2:

at org.apache.activemq.artemis.core.server.impl.QueueImpl.getScheduledCount(QueueImpl.java:1085)
 - blocked on org.apache.activemq.artemis.core.server.impl.QueueImpl@742b7e17
 at org.apache.activemq.artemis.core.server.impl.QueueImpl.getMessageCount(QueueImpl.java:1077)
 at org.apache.activemq.artemis.core.paging.cursor.impl.PageCursorProviderImpl.deliverIfNecessary(PageCursorProviderImpl.java:610)
 at org.apache.activemq.artemis.core.paging.cursor.impl.PageCursorProviderImpl.cleanup(PageCursorProviderImpl.java:365)
 - locked org.apache.activemq.artemis.core.paging.cursor.impl.PageCursorProviderImpl@5aa5010
 at org.apache.activemq.artemis.core.paging.cursor.impl.PageCursorProviderImpl$1.run(PageCursorProviderImpl.java:288)

 

The cleanup thread held pagingStore lock and requested queue lock. The largeMessageDeliver held queue lock and requested pagingStore lock. Deadlock occured.

Put queue::getMessageCount outside of pagingstore lock to fix the bug.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)