You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@activemq.apache.org by "Robbie Gemmell (Jira)" <ji...@apache.org> on 2022/03/15 11:02:00 UTC

[jira] [Resolved] (ARTEMIS-3591) PagingStoreImpl#checkMemory can run the provided task more than once

     [ https://issues.apache.org/jira/browse/ARTEMIS-3591?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Robbie Gemmell resolved ARTEMIS-3591.
-------------------------------------
    Fix Version/s: 2.21.0
         Assignee: Robbie Gemmell
       Resolution: Fixed

> 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
>            Assignee: Robbie Gemmell
>            Priority: Major
>             Fix For: 2.21.0
>
>          Time Spent: 40m
>  Remaining Estimate: 0h
>
> 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)