Jas0n918 created ROCKETMQ-332:
---------------------------------

             Summary: MappedFileQueue is not thread safe, which will cause 
message loss.
                 Key: ROCKETMQ-332
                 URL: https://issues.apache.org/jira/browse/ROCKETMQ-332
             Project: Apache RocketMQ
          Issue Type: Bug
          Components: rocketmq-store
    Affects Versions: 4.1.0-incubating, 4.0.0-incubating
            Reporter: Jas0n918
            Assignee: yukon


In RocketMQ V3.5.8, there is a readWriteLock in 
com.alibaba.rocketmq.store.MapedFileQueue, which guarantee thread safety. But 
in the new org.apache.rocketmq.store.MappedFileQueue, there is not any 
concurrent control mechanism. 

when consumer is fetching message(no large lag), broker calls
org.apache.rocketmq.broker.processor.PullMessageProcessor#processRequest ==>
org.apache.rocketmq.store.DefaultMessageStore#getMessage  ==>
org.apache.rocketmq.store.ConsumeQueue#getIndexBuffer ==>
org.apache.rocketmq.store.MappedFileQueue#findMappedFileByOffset

but findMappedFileByOffset is not thread safe, as
org.apache.rocketmq.store.MappedFileQueue#deleteExpiredFile maybe running 
concurrently(  the size of mappedFiles maybe change) , which will results in 
ConsumeQueue#getIndexBuffer returns null, causing 
_nextBeginOffset  = nextOffsetCorrection(offset, 
consumeQueue.rollNextFile(offset));_+
which will skip the whole consumeQueue file, any messages left in this 
ConsumeQueue will not be consumed by client.




--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to