Robbie Gemmell created ARTEMIS-3591:
---------------------------------------

             Summary: PagingStoreImpl#checkMemory can run the provided task 
more than once
                 Key: ARTEMIS-3591
                 URL: https://issues.apache.org/jira/browse/ARTEMIS-3591
             Project: ActiveMQ Artemis
          Issue Type: Bug
          Components: Broker
    Affects Versions: 2.19.0
            Reporter: Robbie Gemmell


PagingStoreImpl#checkMemory takes a Runnable argument. It takes steps to ensure 
that the given Runnable is an 
org.apache.activemq.artemis.utils.runnables.AtomicRunnable, or wraps it as one, 
before adding it to the 'onMemoryFreedRunnables' queue for later execution in 
some cases.

There is a case where it does this and adds it to the queue 
[[1]|https://github.com/apache/activemq-artemis/blob/f8472fd736eff21d21ca2ab0c5a4dd22f0f1d00e/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/impl/PagingStoreImpl.java#L708],
 but then checks the paging state again to guard against a race and can decide 
to just run the action immediately 
[[2]|https://github.com/apache/activemq-artemis/blob/f8472fd736eff21d21ca2ab0c5a4dd22f0f1d00e/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/impl/PagingStoreImpl.java#L716].
 However it uses the bare action to run it immediately, not the 
potentially-wrapped version it added to the queue by this point. If the passed 
Runnable was not already an AtomicRunnable, as it seems many wont be, then this 
will mean the original action is likely to be run more than once, immediately 
at this point and then again via the AtomicRunnable added to the queue (the 
next time the queue is processed).

It should use a reference to the same AtomicRunnable object it adds to the 
queue, ensuring the underlying task is either run immediately or later, and not 
both. It could additionally try to remove the entry from the queue after 
running it.

[1] 
[https://github.com/apache/activemq-artemis/blob/f8472fd736eff21d21ca2ab0c5a4dd22f0f1d00e/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/impl/PagingStoreImpl.java#L708]
[2] 
[https://github.com/apache/activemq-artemis/blob/f8472fd736eff21d21ca2ab0c5a4dd22f0f1d00e/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/impl/PagingStoreImpl.java#L716]



--
This message was sent by Atlassian Jira
(v8.20.1#820001)

Reply via email to