[
https://issues.apache.org/jira/browse/AMQ-5149?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Dejan Bosanac resolved AMQ-5149.
--------------------------------
Resolution: Fixed
Fixed with http://git-wip-us.apache.org/repos/asf/activemq/commit/e9479275
along with a small refactoring of pagedInMessages (a first step toward more
refactorings in this area).
> Potential deadlock
> -------------------
>
> Key: AMQ-5149
> URL: https://issues.apache.org/jira/browse/AMQ-5149
> Project: ActiveMQ
> Issue Type: Bug
> Affects Versions: 5.9.1
> Reporter: Dejan Bosanac
> Assignee: Dejan Bosanac
> Fix For: 5.10.0
>
>
> There's a potential for deadlock between transaction completion with
> optimizeDispatch=true and periodic message expiry, while checkpoint is in
> progress.
> Contention is over pagedInPendingDispatchLock and checkpointLock.
> The problem is that we're expiring messages under the
> pagedInPendingDispatchLock, so the solution is to change this and use the
> same pattern as we do with pagedInMessages expiry.
> Using optimizedDispatch=false or expireMessagesPeriod=0 will workaround the
> issue.
> Relevant thread traces
> {code}"ActiveMQ Journal Checkpoint Worker" daemon prio=10
> tid=0x00007f0bb8b9d000 nid=0x169b waiting on condition [0x00007f0ba6e95000]
> java.lang.Thread.State: WAITING (parking)
> at sun.misc.Unsafe.park(Native Method)
> - parking to wait for <0x00000000e1c4c4d8> (a
> java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync)
> at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
> at
> java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:834)
> at
> java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:867)
> at
> java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1197)
> at
> java.util.concurrent.locks.ReentrantReadWriteLock$WriteLock.lock(ReentrantReadWriteLock.java:945)
> at
> org.apache.activemq.store.kahadb.MessageDatabase.checkpointUpdate(MessageDatabase.java:1366)
> at
> org.apache.activemq.store.kahadb.MessageDatabase.checkpointCleanup(MessageDatabase.java:840)
> at
> org.apache.activemq.store.kahadb.MessageDatabase$3.run(MessageDatabase.java:317)
> ActiveMQ Broker[localhost] Scheduler" daemon prio=10 tid=0x00007f0bbae73800
> nid=0x1652 waiting on condition [0x00007f0ba7197000]
> java.lang.Thread.State: WAITING (parking)
> at sun.misc.Unsafe.park(Native Method)
> - parking to wait for <0x00000000e1c4c4d8> (a
> java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync)
> at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
> at
> java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:834)
> at
> java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireShared(AbstractQueuedSynchronizer.java:964)
> at
> java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireShared(AbstractQueuedSynchronizer.java:1282)
> at
> java.util.concurrent.locks.ReentrantReadWriteLock$ReadLock.lock(ReentrantReadWriteLock.java:731)
> at
> org.apache.activemq.store.kahadb.MessageDatabase.store(MessageDatabase.java:886)
> at
> org.apache.activemq.store.kahadb.MessageDatabase.store(MessageDatabase.java:869)
> at
> org.apache.activemq.store.kahadb.KahaDBStore$KahaDBMessageStore.removeMessage(KahaDBStore.java:444)
> at
> org.apache.activemq.store.kahadb.KahaDBStore$KahaDBMessageStore.removeAsyncMessage(KahaDBStore.java:416)
> at
> org.apache.activemq.store.kahadb.KahaDBTransactionStore.removeAsyncMessage(KahaDBTransactionStore.java:495)
> at
> org.apache.activemq.store.kahadb.KahaDBTransactionStore$1.removeAsyncMessage(KahaDBTransactionStore.java:182)
> at org.apache.activemq.broker.region.Queue.acknowledge(Queue.java:850)
> at
> org.apache.activemq.broker.region.Queue.removeMessage(Queue.java:1616)
> at
> org.apache.activemq.broker.region.Queue.removeMessage(Queue.java:1608)
> at
> org.apache.activemq.broker.region.Queue.messageExpired(Queue.java:1674)
> at
> org.apache.activemq.broker.region.Queue.messageExpired(Queue.java:1664)
> at org.apache.activemq.broker.region.Queue.doBrowse(Queue.java:1037)
> at
> org.apache.activemq.broker.region.Queue.expireMessages(Queue.java:836)
> at org.apache.activemq.broker.region.Queue.access$100(Queue.java:98)
> at org.apache.activemq.broker.region.Queue$2.run(Queue.java:138)
> at
> org.apache.activemq.thread.SchedulerTimerTask.run(SchedulerTimerTask.java:33)
> at java.util.TimerThread.mainLoop(Timer.java:555)
> at java.util.TimerThread.run(Timer.java:505)
> "ActiveMQ NIO Worker 76408" daemon prio=10 tid=0x00007f0b98db3800 nid=0x5241
> waiting on condition [0x00007f0ba8bb1000]
> java.lang.Thread.State: WAITING (parking)
> at sun.misc.Unsafe.park(Native Method)
> - parking to wait for <0x00000000e1c6ff98> (a
> java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync)
> at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
> at
> java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:834)
> at
> java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireShared(AbstractQueuedSynchronizer.java:964)
> at
> java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireShared(AbstractQueuedSynchronizer.java:1282)
> at
> java.util.concurrent.locks.ReentrantReadWriteLock$ReadLock.lock(ReentrantReadWriteLock.java:731)
> at org.apache.activemq.broker.region.Queue.iterate(Queue.java:1475)
> - locked <0x00000000e1c70130> (a java.lang.Object)
> at org.apache.activemq.broker.region.Queue.wakeup(Queue.java:1709)
> at
> org.apache.activemq.broker.region.PrefetchSubscription$2.afterCommit(PrefetchSubscription.java:439)
> at
> org.apache.activemq.transaction.Transaction.fireAfterCommit(Transaction.java:117)
> at
> org.apache.activemq.transaction.Transaction.doPostCommit(Transaction.java:185)
> at
> org.apache.activemq.transaction.Transaction$2.call(Transaction.java:54)
> at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
> at java.util.concurrent.FutureTask.run(FutureTask.java:166)
> at
> org.apache.activemq.store.kahadb.MessageDatabase.process(MessageDatabase.java:1132)
> at
> org.apache.activemq.store.kahadb.MessageDatabase$10.visit(MessageDatabase.java:1003)
> at
> org.apache.activemq.store.kahadb.data.KahaCommitCommand.visit(KahaCommitCommand.java:130)
> at
> org.apache.activemq.store.kahadb.MessageDatabase.process(MessageDatabase.java:985)
> at
> org.apache.activemq.store.kahadb.MessageDatabase.store(MessageDatabase.java:892)
> at
> org.apache.activemq.store.kahadb.MessageDatabase.store(MessageDatabase.java:869)
> at
> org.apache.activemq.store.kahadb.KahaDBTransactionStore.commit(KahaDBTransactionStore.java:294)
> at
> org.apache.activemq.transaction.XATransaction.storeCommit(XATransaction.java:85)
> at
> org.apache.activemq.transaction.XATransaction.commit(XATransaction.java:75)
> at
> org.apache.activemq.broker.TransactionBroker.commitTransaction(TransactionBroker.java:263)
> at
> org.apache.activemq.broker.BrokerFilter.commitTransaction(BrokerFilter.java:97)
> at
> org.apache.activemq.broker.BrokerFilter.commitTransaction(BrokerFilter.java:97)
> at
> org.apache.activemq.broker.BrokerFilter.commitTransaction(BrokerFilter.java:97)
> at
> org.apache.activemq.broker.BrokerFilter.commitTransaction(BrokerFilter.java:97)
> at
> org.apache.activemq.broker.MutableBrokerFilter.commitTransaction(MutableBrokerFilter.java:103)
> at
> org.apache.activemq.broker.TransportConnection.processCommitTransactionTwoPhase(TransportConnection.java:465)
> at
> org.apache.activemq.command.TransactionInfo.visit(TransactionInfo.java:102)
> at
> org.apache.activemq.broker.TransportConnection.service(TransportConnection.java:329)
> at
> org.apache.activemq.broker.TransportConnection$1.onCommand(TransportConnection.java:184)
> at
> org.apache.activemq.transport.MutexTransport.onCommand(MutexTransport.java:50)
> at
> org.apache.activemq.transport.WireFormatNegotiator.onCommand(WireFormatNegotiator.java:113)
> at
> org.apache.activemq.transport.AbstractInactivityMonitor.onCommand(AbstractInactivityMonitor.java:288)
> at
> org.apache.activemq.transport.TransportSupport.doConsume(TransportSupport.java:83)
> at
> org.apache.activemq.transport.nio.NIOTransport.serviceRead(NIOTransport.java:138)
> at
> org.apache.activemq.transport.nio.NIOTransport$1.onSelect(NIOTransport.java:69)
> at
> org.apache.activemq.transport.nio.SelectorSelection.onSelect(SelectorSelection.java:94)
> at
> org.apache.activemq.transport.nio.SelectorWorker$1.run(SelectorWorker.java:119)
> at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
> at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
> at java.lang.Thread.run(Thread.java:722){code}
--
This message was sent by Atlassian JIRA
(v6.2#6252)