This is an automated email from the ASF dual-hosted git repository. rnewson pushed a commit to branch nouveau-indexmanager-improvements in repository https://gitbox.apache.org/repos/asf/couchdb.git
commit 460a49d1371c7cf19a8e0fc132ed2727da676bc4 Author: Robert Newson <[email protected]> AuthorDate: Wed Oct 4 09:50:39 2023 +0100 teach Caffeine not to evict active indexes --- .../main/java/org/apache/couchdb/nouveau/core/Index.java | 4 ++++ .../org/apache/couchdb/nouveau/core/IndexManager.java | 16 +++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/nouveau/src/main/java/org/apache/couchdb/nouveau/core/Index.java b/nouveau/src/main/java/org/apache/couchdb/nouveau/core/Index.java index ef50688ff..848a29c51 100644 --- a/nouveau/src/main/java/org/apache/couchdb/nouveau/core/Index.java +++ b/nouveau/src/main/java/org/apache/couchdb/nouveau/core/Index.java @@ -158,6 +158,10 @@ public abstract class Index implements Closeable { } } + public final boolean isActive() { + return permits.availablePermits() < Integer.MAX_VALUE || permits.hasQueuedThreads(); + } + protected final void assertUpdateSeqProgress(final long matchSeq, final long updateSeq) throws UpdatesOutOfOrderException { assert Thread.holdsLock(this); diff --git a/nouveau/src/main/java/org/apache/couchdb/nouveau/core/IndexManager.java b/nouveau/src/main/java/org/apache/couchdb/nouveau/core/IndexManager.java index caa265866..cd4af687e 100644 --- a/nouveau/src/main/java/org/apache/couchdb/nouveau/core/IndexManager.java +++ b/nouveau/src/main/java/org/apache/couchdb/nouveau/core/IndexManager.java @@ -24,6 +24,8 @@ import com.github.benmanes.caffeine.cache.Caffeine; import com.github.benmanes.caffeine.cache.RemovalCause; import com.github.benmanes.caffeine.cache.RemovalListener; import com.github.benmanes.caffeine.cache.Scheduler; +import com.github.benmanes.caffeine.cache.Weigher; + import io.dropwizard.lifecycle.Managed; import jakarta.ws.rs.WebApplicationException; import jakarta.ws.rs.core.Response.Status; @@ -39,6 +41,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Lock; import java.util.stream.Stream; import org.apache.couchdb.nouveau.api.IndexDefinition; +import org.checkerframework.checker.index.qual.NonNegative; import org.eclipse.jetty.io.RuntimeIOException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -252,7 +255,8 @@ public final class IndexManager implements Managed { cache = Caffeine.newBuilder() .recordStats(() -> new MetricsStatsCounter(metricRegistry, name(IndexManager.class, "cache"))) .initialCapacity(maxIndexesOpen) - .maximumSize(maxIndexesOpen) + .maximumWeight(maxIndexesOpen) + .weigher(new IndexWeigher()) .expireAfterAccess(Duration.ofSeconds(idleSeconds)) .scheduler(Scheduler.systemScheduler()) .evictionListener(new IndexEvictionListener()) @@ -307,6 +311,16 @@ public final class IndexManager implements Managed { } } + private class IndexWeigher implements Weigher<String, Index> { + + @Override + public @NonNegative int weigh(String key, Index value) { + // Pin active indexes + return value.isActive() ? 0 : 1; + } + + } + private void close(final String name, final Index index) throws IOException { IOUtils.runAll( () -> {
