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 07:49:00 UTC
[jira] [Closed] (ARTEMIS-2209) Fix deadlock while getting queue
message count during cleanup
[ https://issues.apache.org/jira/browse/ARTEMIS-2209?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
yangwei closed ARTEMIS-2209.
----------------------------
Resolution: Fixed
Queue::getMessageCount don't need to be synchronized in the trunk code. The bug won't occur.
> 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
> Affects Versions: 2.6.3
> Reporter: yangwei
> Priority: Critical
>
> 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 occurred.
> Put queue::getMessageCount outside of pagingstore lock to fix the bug.
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)