Repository: activemq Updated Branches: refs/heads/activemq-5.15.x c6103415b -> a9b81ace6
AMQ-7082 - ensure flush sees free list, use lazySet to avoid store barrier, thanks cshannon Project: http://git-wip-us.apache.org/repos/asf/activemq/repo Commit: http://git-wip-us.apache.org/repos/asf/activemq/commit/a9b81ace Tree: http://git-wip-us.apache.org/repos/asf/activemq/tree/a9b81ace Diff: http://git-wip-us.apache.org/repos/asf/activemq/diff/a9b81ace Branch: refs/heads/activemq-5.15.x Commit: a9b81ace623d62e92b75ddc31c424c0ed4cae9d1 Parents: c610341 Author: gtully <[email protected]> Authored: Mon Oct 22 15:16:26 2018 +0100 Committer: Jeff Genender <[email protected]> Committed: Mon Oct 22 08:45:52 2018 -0600 ---------------------------------------------------------------------- .../apache/activemq/store/kahadb/disk/page/PageFile.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/activemq/blob/a9b81ace/activemq-kahadb-store/src/main/java/org/apache/activemq/store/kahadb/disk/page/PageFile.java ---------------------------------------------------------------------- diff --git a/activemq-kahadb-store/src/main/java/org/apache/activemq/store/kahadb/disk/page/PageFile.java b/activemq-kahadb-store/src/main/java/org/apache/activemq/store/kahadb/disk/page/PageFile.java index 2c6348e..fe79a2d 100644 --- a/activemq-kahadb-store/src/main/java/org/apache/activemq/store/kahadb/disk/page/PageFile.java +++ b/activemq-kahadb-store/src/main/java/org/apache/activemq/store/kahadb/disk/page/PageFile.java @@ -39,6 +39,7 @@ import java.util.TreeMap; import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.atomic.AtomicReference; import java.util.zip.Adler32; import java.util.zip.Checksum; @@ -134,7 +135,7 @@ public class PageFile { // Keeps track of free pages. private final AtomicLong nextFreePageId = new AtomicLong(); private SequenceSet freeList = new SequenceSet(); - private SequenceSet recoveredFreeList = null; + private AtomicReference<SequenceSet> recoveredFreeList = new AtomicReference<SequenceSet>(); private final AtomicLong nextTxid = new AtomicLong(); // Persistent settings stored in the page file. @@ -469,8 +470,8 @@ public class PageFile { LOG.info(toString() + ". Recovered pageFile free list of size: " + newFreePages.rangeSize()); if (!newFreePages.isEmpty()) { - // allow flush (with index lock held) to merge - recoveredFreeList = newFreePages; + // allow flush (with index lock held) to merge eventually + recoveredFreeList.lazySet(newFreePages); } // all set for clean shutdown needsFreePageRecovery = false; @@ -561,9 +562,9 @@ public class PageFile { throw new IOException("Page file already stopped: checkpointing is not allowed"); } - SequenceSet toMerge = recoveredFreeList; + SequenceSet toMerge = recoveredFreeList.get(); if (toMerge != null) { - recoveredFreeList = null; + recoveredFreeList.lazySet(null); Sequence seq = toMerge.getHead(); while (seq != null) { freeList.add(seq);
