This is an automated email from the ASF dual-hosted git repository. reschke pushed a commit to branch OAK-11852 in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git
commit 47661ab9c01d5758a0e4d4fb812a129f3d08f4d9 Author: Julian Reschke <[email protected]> AuthorDate: Tue Aug 12 07:59:39 2025 +0100 OAK-11852: Use new Bloom filter implementation in document store --- .../document/cache/CacheChangesTracker.java | 44 ++++++++++------------ 1 file changed, 19 insertions(+), 25 deletions(-) diff --git a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/cache/CacheChangesTracker.java b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/cache/CacheChangesTracker.java index 14e30cd673..196f6188d4 100644 --- a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/cache/CacheChangesTracker.java +++ b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/cache/CacheChangesTracker.java @@ -16,14 +16,13 @@ */ package org.apache.jackrabbit.oak.plugins.document.cache; -import org.apache.jackrabbit.guava.common.hash.BloomFilter; -import org.apache.jackrabbit.guava.common.hash.Funnel; -import org.apache.jackrabbit.guava.common.hash.PrimitiveSink; +import org.apache.jackrabbit.oak.commons.collections.BloomFilter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.Closeable; import java.util.List; +import java.util.concurrent.atomic.AtomicReference; import java.util.function.Predicate; public class CacheChangesTracker implements Closeable { @@ -62,10 +61,10 @@ public class CacheChangesTracker implements Closeable { changeTrackers.remove(this); if (LOG.isDebugEnabled()) { - if (lazyBloomFilter.filter == null) { + if (lazyBloomFilter.filterRef.get() == null) { LOG.debug("Disposing CacheChangesTracker for {}, no filter was needed", keyFilter); } else { - LOG.debug("Disposing CacheChangesTracker for {}, filter fpp was: {}", keyFilter, lazyBloomFilter.filter.expectedFpp()); + LOG.debug("Disposing CacheChangesTracker for {}, filter fpp was: {}", keyFilter, LazyBloomFilter.FPP); } } } @@ -76,38 +75,33 @@ public class CacheChangesTracker implements Closeable { private final int entries; - private volatile BloomFilter<String> filter; + private final AtomicReference<BloomFilter> filterRef; public LazyBloomFilter(int entries) { this.entries = entries; + this.filterRef = new AtomicReference<>(); } public synchronized void put(String entry) { - getFilter().put(entry); + getFilter().add(entry); } public boolean mightContain(String entry) { - if (filter == null) { - return false; - } else { - synchronized (this) { - return filter.mightContain(entry); - } - } + BloomFilter f = filterRef.get(); + return f != null && f.mayContain(entry); } - private BloomFilter<String> getFilter() { - if (filter == null) { - filter = BloomFilter.create(new Funnel<String>() { - private static final long serialVersionUID = -7114267990225941161L; - - @Override - public void funnel(String from, PrimitiveSink into) { - into.putUnencodedChars(from); - } - }, entries, FPP); + private BloomFilter getFilter() { + BloomFilter result = filterRef.get(); + if (result == null) { + BloomFilter newFilter = BloomFilter.construct(entries, FPP); + if (filterRef.compareAndSet(null, newFilter)) { + result = newFilter; + } else { + result = filterRef.get(); + } } - return filter; + return result; } } }
