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)