While looking into QPID-1941 (moved messages remaining in the JMX
viewMessages() results for the old queue, but not being considered
still on the queue) for GSoC I have noticed an inconsistency between
the recovery behaviour of persistent messages which are moved, and
those handled only by the normal message delivery path.

if (message.isPersistent() && toQueue.isDurable())
{
     store.enqueueMessage(storeContext, toQueue, message.getMessageId());
}

The above check in the SimpleAMQQueue moveMessagesToAnotherQueue
method means that persistent messages are not moved in the message
store unless the destination queue is durable. As a result, if the
broker is restarted while using a persistence store any persistent
messages which have been moved to a non-durable queue are lost.
However, any persistent messages delivered directly to the same
non-durable queue are currently recovered at startup as the broker
places no such restriction on messages in the normal delivery path, eg
in IncomingMessage:

if (persistent)
{
    .
    .
    .
    store.enqueueMessage(.....)

I am not particularly bothered either way by the 'should persistent
messages should be recovered from non durable queues' argument, but I
do think they should be treated equally whether they have been moved
or not. It means changing the previous behaviour of the section, but I
think it should be entirely consistent one way or the other, so...any
objections to me removing the durability check from the move method?

Robbie

---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:dev-subscr...@qpid.apache.org

Reply via email to