Red Hat Bugzilla – Bug 591287
MRG session object does not seem to be able to recover from resource limit exceeded exception
Last modified: 2013-02-24 19:48:18 EST
Description of problem:
MRG session object does not seem to be able to recover from resource limit exceeded exception. After the session receives this exception we unable to send any further messages through this session to the broker.
Steps to Reproduce:
Sequence of events:
1) Create a single Exchange,
a) At this time, there are no active Producers, and no active Consumers
b) Direct Exchange
2) Start a Consumer that creates its own Queue, and creates a Binding to the existing Exchange
a) Dynamic Queue (i.e., AutoDelete)
b) Consumer written in either JAVA or C++
c) Currently no traffic on the Queue (there are no active Producers)
3) Several Consumers are started
a) Each Consumer creates its own, separate Queue
b) Same binding to the same Exchange
4) Start Several Producers
a) Sending Messages to the Exchange created in Step 1
b) With the correct Binding Key
c) Low messge rate, 1 msg every 5 seconds from each Producer
5) The Consumer begins to fall behind, completely filling the Queue
6) Producers begin receiving 'ResourceLimitExceededException'
We understand this is the expected operation, so we attempt to recover...
i) We shutdown the 'offending' Consumer, which deletes the full Queue
Producers continue to receive the 'ResourceLimitExceededException'
QUESTION: Why does the Producer continue to receive the error message? The error condition has been removed.
The session should recover, meaning we should be able to send messages to the exchange without exceptions being thrown when the error condition has been removed from within the broker.
We attempted to create a new session, but after doing so the application cored after attempting to send a message.
We are sending messages asynchronously to the broker through the MessageReplayTracker class. After the session was recreated it was passed to the MessageReplayTracker through the method replay(). We then called the send() method and the core occured when the MessageReplayTracker object made a call to the checkCompletion() method. This resulted in a segmentation fault.