Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix deadlock while getting queue message count during cleanup #2476

Closed

Conversation

wy96f
Copy link
Contributor

@wy96f wy96f commented Dec 21, 2018

#2369 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.(ServerConsumerImpl.java:1171)
at org.apache.activemq.artemis.core.server.impl.ServerConsumerImpl$LargeMessageDeliverer.(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.

@wy96f wy96f closed this Dec 21, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
1 participant