Dejan Bosanac created AMQ-5149:
----------------------------------

             Summary: 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)

Reply via email to