Bug 621468
| Summary: | rejected messages are not dequeued | |||
|---|---|---|---|---|
| Product: | Red Hat Enterprise MRG | Reporter: | Gordon Sim <gsim> | |
| Component: | qpid-cpp | Assignee: | Jonathan Robie <jonathan.robie> | |
| Status: | CLOSED ERRATA | QA Contact: | Martin Kudlej <mkudlej> | |
| Severity: | high | Docs Contact: | ||
| Priority: | high | |||
| Version: | beta | CC: | gsim, iboverma, jneedle, mkudlej, tross | |
| Target Milestone: | 1.3.0.1 | |||
| Target Release: | --- | |||
| Hardware: | All | |||
| OS: | Linux | |||
| Whiteboard: | ||||
| Fixed In Version: | Doc Type: | Bug Fix | ||
| Doc Text: |
A flaw in the message broker caused rejected messages to remain on the queue. If a durable message was rejected and the broker was restarted, the message would stay in the queue since it was not removed from the durable store. As a result, the rejected message was erroneously redelivered. With this update, the aforementioned defect has been fixed and rejected messages are now properly dequeued.
|
Story Points: | --- | |
| Clone Of: | ||||
| : | 652092 (view as bug list) | Environment: | ||
| Last Closed: | 2010-11-30 17:50:50 UTC | Type: | --- | |
| Regression: | --- | Mount Type: | --- | |
| Documentation: | --- | CRM: | ||
| Verified Versions: | Category: | --- | ||
| oVirt Team: | --- | RHEL 7.3 requirements from Atomic Host: | ||
| Cloudforms Team: | --- | Target Upstream Version: | ||
| Embargoed: | ||||
| Bug Depends On: | ||||
| Bug Blocks: | 652092 | |||
|
Description
Gordon Sim
2010-08-05 07:13:25 UTC
Fixed upstream in commit 1002147. Adding a test to the store module on qpidcomponents.org. The test mentioned in the previous comment was committed to https://svn.jboss.org/repos/rhmessaging/store/trunk/cpp as r4354. Link to test diff: http://viewvc.jboss.org/cgi-bin/viewvc.cgi/rhmessaging/store/trunk/cpp/tests/python_tests/client_persistence.py?r1=4196&r2=4354 Test added is here: svn diff -r4353:4354 http://anonsvn.jboss.org/repos/rhmessaging/store/trunk/cpp Cherry-picked into: mrg_1.3.x fa6eab57a32883969ebdd78fa589846068375de7
Technical note added. If any revisions are required, please edit the "Technical Notes" field
accordingly. All revisions will be proofread by the Engineering Content Services team.
New Contents:
Cause: A defect in the message broker causes rejected messages to remain on the queue.
Consequence: If a durable message is rejected, and the broker is restarted. The message will have remained on the queue since it was not removed from the durable store. In this case, the rejected message is erroneously redelivered.
Fix: The broker defect has been fixed.
Result: Rejected messages are now properly dequeued.
Reproduced on version 1.3 on RHEL5.
Tested on RHEL5/4 x i386/x86_64 with
python-qpid-0.7.946106-14
qpid-cpp-client-0.7.946106-19
qpid-cpp-client-devel-0.7.946106-19
qpid-cpp-client-devel-docs-0.7.946106-19
qpid-cpp-client-ssl-0.7.946106-19
qpid-cpp-server-0.7.946106-19
qpid-cpp-server-devel-0.7.946106-19
qpid-cpp-server-ssl-0.7.946106-19
qpid-cpp-server-store-0.7.946106-19
qpid-cpp-server-xml-0.7.946106-19
qpid-java-client-0.7.946106-12
qpid-java-common-0.7.946106-12
qpid-java-example-0.7.946106-12
qpid-tools-0.7.946106-11
qmf-devel-0.7.946106-19
python-qmf-0.7.946106-14
qmf-0.7.946106-19
and it works -->VERIFIED
reproducer:
import sys
import os
from qpid.messaging import *
import qmf.console
import time
if len(sys.argv)<2:
broker = "localhost:5672"
else:
broker = sys.argv[1]
if len(sys.argv)<3:
address = "amq.topic"
else:
address = sys.argv[2]
connection = Connection(broker)
try:
connection.open()
session = connection.session()
snd = session.sender("tmr; {create:always, node:{type:queue, durable:True}}")
rcv = session.receiver("tmr; {create:always, node:{type:queue, durable:True}}")
m1 = Message("test_message_reject", durable=True, correlation_id="Msg00010")
snd.send(m1)
m2 = rcv.fetch()
session.acknowledge(message=m2, disposition=Disposition(REJECTED))
connection.close()
os.system("service qpidd restart")
time.sleep(20)
session2 = qmf.console.Session()
broker = session2.addBroker()
agent = None;
for i_agent in session2.getAgents():
if i_agent.getAgentBank() == '0':
agent = i_agent;
queue_list = session2.getObjects(_class="queue", _agent=agent)
for queue in queue_list:
if queue.name == "tmr":
print "queue depth:", queue.msgDepth
assert queue.msgDepth == 0
session2.delBroker(broker)
except MessagingError,m:
print m
An advisory has been issued which should help the problem described in this bug report. This report is therefore being closed with a resolution of ERRATA. For more information on therefore solution and/or where to find the updated files, please follow the link below. You may reopen this bug report if the solution does not work for you. http://rhn.redhat.com/errata/RHSA-2010-0921.html
Technical note updated. If any revisions are required, please edit the "Technical Notes" field
accordingly. All revisions will be proofread by the Engineering Content Services team.
Diffed Contents:
@@ -1,7 +1 @@
-Cause: A defect in the message broker causes rejected messages to remain on the queue.
+A flaw in the message broker caused rejected messages to remain on the queue. If a durable message was rejected and the broker was restarted, the message would stay in the queue since it was not removed from the durable store. As a result, the rejected message was erroneously redelivered. With this update, the aforementioned defect has been fixed and rejected messages are now properly dequeued.-
-Consequence: If a durable message is rejected, and the broker is restarted. The message will have remained on the queue since it was not removed from the durable store. In this case, the rejected message is erroneously redelivered.
-
-Fix: The broker defect has been fixed.
-
-Result: Rejected messages are now properly dequeued.
|