Christopher L. Shannon created AMQ-6293:
-------------------------------------------

             Summary: Queue destination statistics can be inaccurate with a 
purge
                 Key: AMQ-6293
                 URL: https://issues.apache.org/jira/browse/AMQ-6293
             Project: ActiveMQ
          Issue Type: Bug
          Components: Broker
    Affects Versions: 5.13.3
            Reporter: Christopher L. Shannon
            Assignee: Christopher L. Shannon


Recently I have been seeing some negative message counts from the 
destinationStatistics message counter of a Queue.  The dequeue counts also seem 
to be wrong as well.  This is hard to reproduce as it happens rarely, but 
running a purge while there are consumers online acking seems to be an 
occasional cause. 

The removeMessage method in a Queue can be called more than once for the same 
message if an ack comes in at the same time as a purge.  (This is because 
messages are prefetched so they can be acked even while they are purged) Taking 
a closer look, the broker handles duplicate calls ok in most cases but there 
are two areas that need to be fixed.

First, there is a race condition in the dropMessage() method in Queue.  It 
checks if the message is dropped before continuing with the drop.  This is not 
thread safe because the two methods calls are not synchronized together. I was 
able to show negative counts by introducing a small amount of latency between 
those two calls during a test.  There needs to be some synchronization done 
here to prevent the counts from getting out of sync.

Second, the dequeue counter needs to be moved out of the removeMessage() method 
and to the dropMessage() method so it can be protected by the same sync and 
only incremented when a message is dropped to prevent duplicate counts.




--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to