[
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: [email protected]
For additional commands, e-mail: [email protected]