[
https://issues.apache.org/jira/browse/QPID-7811?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Lorenz Quack resolved QPID-7811.
--------------------------------
Resolution: Fixed
> [Java Broker] Asynchronous message store recoverer can delete message content
> for 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.0, qpid-java-6.0.1, qpid-java-6.0.2,
> qpid-java-6.0.3, qpid-java-6.0.4, qpid-java-6.0.5, qpid-java-6.0.6,
> qpid-java-6.0.7, qpid-java-6.1, qpid-java-6.1.1, qpid-java-6.1.2,
> qpid-java-6.1.3
> Reporter: Alex Rudyy
> Priority: Blocker
> Fix For: qpid-java-broker-7.0.0, qpid-java-6.1.4, qpid-java-6.0.8
>
> Attachments:
> 0001-QPID-7811-Java-Broker-Ensure-AsynchronousMessageStor.patch
>
>
> {{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 or
> equal to "max message id evaluated 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.4.14#64029)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]