Alex Rudyy created QPID-7811:
--------------------------------
Summary: [Java Broker] Asynchronous message store recoverer can
delete the message enqueued after broker startup
Key: QPID-7811
URL: https://issues.apache.org/jira/browse/QPID-7811
Project: Qpid
Issue Type: Bug
Components: Java Broker
Affects Versions: qpid-java-6.1.3, qpid-java-6.1.2, qpid-java-6.1.1,
qpid-java-6.1, qpid-java-6.0.7, qpid-java-6.0.6, qpid-java-6.0.5,
qpid-java-6.0.4, qpid-java-6.0.3, qpid-java-6.0.2, qpid-java-6.0.1,
qpid-java-6.0
Reporter: Alex Rudyy
AsynchronousMessageStoreRecoverer}} recovers messages with ID values less than
"max message id" evaluated on broker startup. On completion of queue recovery,
the {{AsynchronousMessageStoreRecoverer}} iterates over the orphan messages and
deletes them. The message is considered orphan when enqueuing record is not
found among recovered enqueuing records and the message id is less than "max
message id evaluated on broker startup".
When queues have huge backlogs (millions of messages), the recovery can take
time. The messages on other queues can be consumed and published during this
time. When messages with message id equals to "max message id" - 1 is
consumed, the recoverer can mistakenly put message with id greater than "max
message id on broker startup" into orphan messages and the content of such
message could be deleted.
The following code causes such mistaken orphan message detection:
{code}
getStoreReader().visitMessages(new MessageHandler()
{
@Override
public boolean handle(final StoredMessage<?> storedMessage)
{
long messageNumber = storedMessage.getMessageNumber();
if (!_recoveredMessages.containsKey(messageNumber))
{
messagesToDelete.add(storedMessage);
}
return _continueRecovery.get() && messageNumber <
_maxMessageId - 1;
}
});
{code}
The message id should be checked before putting message into collection
"messagesToDelete"
--
This message was sent by Atlassian JIRA
(v6.3.15#6346)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]