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(
                 () -> {

Reply via email to