[ https://issues.apache.org/jira/browse/QPID-1101?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Marnie McCormack reopened QPID-1101: ------------------------------------ Needs to be merged to trunk and verified (re-tested) on M2.1.x > DestNameExchange uses shallow copy of queues for routing, causing routing to > fail if queueDeleted. > -------------------------------------------------------------------------------------------------- > > Key: QPID-1101 > URL: https://issues.apache.org/jira/browse/QPID-1101 > Project: Qpid > Issue Type: Bug > Components: Java Broker > Affects Versions: M2, M2.1 > Reporter: Martin Ritchie > Assignee: Martin Ritchie > Fix For: M3 > > Original Estimate: 1h > Remaining Estimate: 1h > > Summary: > When testing with the BDBStore module it was noted that on occasion a mesage > would be enqueued on a queue but the Metadata was not in the DB. > This is due to the the fact that when routing takes place a shallow copy of > queues the message has been enqueued to is returned by the DestNameExchange. > If the queue is deleted before the message can be routed then it is removed > from the list and never routed. This results in the message being purged from > the DB but the enqueued reference remaining. > The solution is to make a deep copy so that the DestNameExchange can modify > the list without affecting routing. > Steps to Reproduce: > This is a race condition so can be difficult but: > Using the broker with the BDBStore Module. > Set up a client that reads from queue1 and replies to the JMSReplyTo. > Set up client2 that reads from a tempQueue. > Use client2 to send two messages (with tempQueue as the replyTo) to queue1 > When you receive message 1 on client2 close the consumer > If this is running inVM then the consumer close should occur as message 2 is > routing. > Restart the broker and it should fail to start with a MetaData not found for > message 5 error. > Defect Identification: > As above, the shallow copy of enqueued queues is being modifed during routing. > Proposed Changes: > Make a copy of the list > Swap this: > payload.enqueue(queues); > to > payload.enqueue(new ArrayList<AMQQueue>(queues)); > Test Strategy: > QueueDeleteRouteTest to be provided > This must be done on trunk then back merged. > Difficulties exist as the trunk now uses QpidTestCase which is not capable of > running multiple InVM brokers -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.