qpid-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Alex Rudyy (JIRA)" <j...@apache.org>
Subject [jira] [Created] (QPID-7811) [Java Broker] Asynchronous message store recoverer can delete the message enqueued after broker startup
Date Mon, 05 Jun 2017 12:51:04 GMT
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: dev-unsubscribe@qpid.apache.org
For additional commands, e-mail: dev-help@qpid.apache.org


Mime
View raw message