[ https://issues.apache.org/jira/browse/QPID-1909?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Jonathan Robie updated QPID-1909: --------------------------------- Attachment: QPID-1909.patch > Consumer with byte credit can get ignored if a large message "eclipses" a > small one. > ------------------------------------------------------------------------------------ > > Key: QPID-1909 > URL: https://issues.apache.org/jira/browse/QPID-1909 > Project: Qpid > Issue Type: Bug > Components: C++ Broker > Affects Versions: 0.5 > Reporter: Alan Conway > Assignee: Jonathan Robie > Attachments: QPID-1909.patch > > > Given: A consumer with byte credit N for a queue with messages Big size > N > and Small size < N > The consumer should not be able to consume Big. Now remove Big with a > different consumer. > The consumer should now be able to consume Small, but doesn't > The problem in Queue.cpp is twofold: > - if a consumer returns "false" from accept, it is assumed to be blocked and > is removed from the listener set. It won't be notified of new messages > - the queue only notifies when new messages arrive. It does not notify when > a blocking message is removed. > This is demonstrated by adding the following to test_credit_flow_bytes in > message.py: > # Check for bug that allowed a small message to be hidden by a > larger one. > > > session.message_transfer(message=Message(session.delivery_properties(routing_key="q"), > "toobigtoobigtoobigtoobig")) > > session.message_transfer(message=Message(session.delivery_properties(routing_key="q"), > "abcdefgh")) > session.message_flow(unit = session.credit_unit.byte, value = > msg_size, destination = "c") > try: > q.get(timeout = 1) # Should fail, message is too big. > > > self.fail("Expected Empty exception") > except Empty: None > # Create another consumer to remove the large message > > > session.message_subscribe(queue = "q", destination = "c2") > session.message_flow(unit = session.credit_unit.byte, value = > 0xFFFFFFFFL, destination = "c2") > session.message_flow(unit = session.credit_unit.message, value = 1, > destination = "c2") > self.assertDataEquals(session, session.incoming("c2").get(timeout=1), > "toobigtoobigtoobigtoobig") > # Now the first consumer should be able to receive the smaller > message. > > self.assertDataEquals(session, q.get(timeout = 1), "abcdefgh") -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online. --------------------------------------------------------------------- Apache Qpid - AMQP Messaging Implementation Project: http://qpid.apache.org Use/Interact: mailto:dev-subscr...@qpid.apache.org