[ 
https://issues.apache.org/jira/browse/QPID-4574?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13574608#comment-13574608
 ] 

Rajith Attapattu commented on QPID-4574:
----------------------------------------

The issue here is that the locks are acquired in the wrong order.
A solution to this is to acquire the failoverMutex in the dispatchMessage 
method in Dispatcher before it acquires the messageDeliveryLock.
This allows any method (that requires the failoverMutex) called from within the 
onMessage method to acquire the locks in the correct order.

Since the close method acquires the messageDeliveryLock after getting the 
failoverMutex, the deadlocks is avoided.
This allows the close method to wait until an inprogress message dispatching 
operation to proceed before it continues with the close operation.

I have tested this fix with the attached reproducers and it passes our test 
suite as well.
                
> [JMS] Deadlock involving _failoverMutex and _messageDeliveryLock
> ----------------------------------------------------------------
>
>                 Key: QPID-4574
>                 URL: https://issues.apache.org/jira/browse/QPID-4574
>             Project: Qpid
>          Issue Type: Bug
>          Components: Java Client
>    Affects Versions: 0.14, 0.16, 0.18, 0.20
>            Reporter: Rajith Attapattu
>            Assignee: Rajith Attapattu
>             Fix For: 0.21
>
>
> This deadlock can manifest when a you have a producer sending messages inside 
> an onMessage() call.
> This is a common enough pattern, and is used by intermediaries like Message 
> Bridges, ESB's etc..
> "Dispatcher-0-Conn-1":
>       at 
> org.apache.qpid.client.BasicMessageProducer.send(BasicMessageProducer.java:309)
>       - waiting to lock <0x00000000ecfd15a8> (a java.lang.Object)
>       at Test_00782235$1.onMessage(Test_00782235.java:29)
>       at 
> org.apache.qpid.client.BasicMessageConsumer.notifyMessage(BasicMessageConsumer.java:751)
>       at 
> org.apache.qpid.client.BasicMessageConsumer_0_10.notifyMessage(BasicMessageConsumer_0_10.java:141)
>       at 
> org.apache.qpid.client.BasicMessageConsumer.notifyMessage(BasicMessageConsumer.java:725)
>       at 
> org.apache.qpid.client.BasicMessageConsumer_0_10.notifyMessage(BasicMessageConsumer_0_10.java:186)
>       at 
> org.apache.qpid.client.BasicMessageConsumer_0_10.notifyMessage(BasicMessageConsumer_0_10.java:54)
>       at 
> org.apache.qpid.client.AMQSession$Dispatcher.notifyConsumer(AMQSession.java:3479)
>       at 
> org.apache.qpid.client.AMQSession$Dispatcher.dispatchMessage(AMQSession.java:3418)
>       - locked <0x00000000ecfd16c8> (a java.lang.Object)
>       - locked <0x00000000ecfd16d8> (a java.lang.Object)
>       at 
> org.apache.qpid.client.AMQSession$Dispatcher.access$1000(AMQSession.java:3205)
>       at org.apache.qpid.client.AMQSession.dispatch(AMQSession.java:3198)
>       at 
> org.apache.qpid.client.message.UnprocessedMessage.dispatch(UnprocessedMessage.java:54)
>       at 
> org.apache.qpid.client.AMQSession$Dispatcher.run(AMQSession.java:3341)
>       at java.lang.Thread.run(Thread.java:679)
> "main":
>       at 
> org.apache.qpid.client.BasicMessageConsumer.close(BasicMessageConsumer.java:598)
>       - waiting to lock <0x00000000ecfd16c8> (a java.lang.Object)
>       - locked <0x00000000ecfd15a8> (a java.lang.Object)
>       at 
> org.apache.qpid.client.BasicMessageConsumer.close(BasicMessageConsumer.java:558)
>       at Test_00782235.<init>(Test_00782235.java:62)
>       at Test_00782235.main(Test_00782235.java:12)

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@qpid.apache.org
For additional commands, e-mail: dev-h...@qpid.apache.org

Reply via email to