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 378db0941428d8002774a90904c73c88da41ae3f Author: Robert Newson <[email protected]> AuthorDate: Wed Oct 4 11:55:30 2023 +0100 inject caffeine scheduler from application config --- .../java/org/apache/couchdb/nouveau/NouveauApplication.java | 9 +++++++++ .../couchdb/nouveau/NouveauApplicationConfiguration.java | 11 +++++++++++ .../java/org/apache/couchdb/nouveau/core/IndexManager.java | 8 +++++++- .../apache/couchdb/nouveau/health/IndexHealthCheckTest.java | 2 ++ 4 files changed, 29 insertions(+), 1 deletion(-) diff --git a/nouveau/src/main/java/org/apache/couchdb/nouveau/NouveauApplication.java b/nouveau/src/main/java/org/apache/couchdb/nouveau/NouveauApplication.java index a7cfdeed6..89b2b8596 100644 --- a/nouveau/src/main/java/org/apache/couchdb/nouveau/NouveauApplication.java +++ b/nouveau/src/main/java/org/apache/couchdb/nouveau/NouveauApplication.java @@ -13,10 +13,12 @@ package org.apache.couchdb.nouveau; +import com.github.benmanes.caffeine.cache.Scheduler; import io.dropwizard.core.Application; import io.dropwizard.core.setup.Environment; import io.swagger.v3.jaxrs2.integration.resources.OpenApiResource; import java.util.concurrent.ForkJoinPool; +import java.util.concurrent.ScheduledExecutorService; import org.apache.couchdb.nouveau.core.IndexManager; import org.apache.couchdb.nouveau.health.AnalyzeHealthCheck; import org.apache.couchdb.nouveau.health.IndexHealthCheck; @@ -39,12 +41,19 @@ public class NouveauApplication extends Application<NouveauApplicationConfigurat @Override public void run(NouveauApplicationConfiguration configuration, Environment environment) throws Exception { + // configure index manager final IndexManager indexManager = new IndexManager(); indexManager.setCommitIntervalSeconds(configuration.getCommitIntervalSeconds()); indexManager.setIdleSeconds(configuration.getIdleSeconds()); indexManager.setMaxIndexesOpen(configuration.getMaxIndexesOpen()); indexManager.setMetricRegistry(environment.metrics()); + final ScheduledExecutorService schedulerExecutorService = environment + .lifecycle() + .scheduledExecutorService("index-manager-%d") + .threads(configuration.getSchedulerThreadCount()) + .build(); + indexManager.setScheduler(Scheduler.forScheduledExecutorService(schedulerExecutorService)); indexManager.setSearcherFactory(new ParallelSearcherFactory(ForkJoinPool.commonPool())); indexManager.setObjectMapper(environment.getObjectMapper()); indexManager.setRootDir(configuration.getRootDir()); diff --git a/nouveau/src/main/java/org/apache/couchdb/nouveau/NouveauApplicationConfiguration.java b/nouveau/src/main/java/org/apache/couchdb/nouveau/NouveauApplicationConfiguration.java index 50d320132..dce6fe6da 100644 --- a/nouveau/src/main/java/org/apache/couchdb/nouveau/NouveauApplicationConfiguration.java +++ b/nouveau/src/main/java/org/apache/couchdb/nouveau/NouveauApplicationConfiguration.java @@ -33,6 +33,9 @@ public class NouveauApplicationConfiguration extends Configuration { @NotNull private Path rootDir = null; + @Min(2) + private int schedulerThreadCount = 5; + @JsonProperty public void setMaxIndexesOpen(int maxIndexesOpen) { this.maxIndexesOpen = maxIndexesOpen; @@ -68,4 +71,12 @@ public class NouveauApplicationConfiguration extends Configuration { public Path getRootDir() { return rootDir; } + + public int getSchedulerThreadCount() { + return schedulerThreadCount; + } + + public void setSchedulerThreadCount(int schedulerThreadCount) { + this.schedulerThreadCount = schedulerThreadCount; + } } 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 c82caf28e..907a52a4c 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 @@ -80,6 +80,8 @@ public final class IndexManager implements Managed { private MetricRegistry metricRegistry; + private Scheduler scheduler; + private SearcherFactory searcherFactory; private AsyncLoadingCache<String, Index> cache; @@ -212,6 +214,10 @@ public final class IndexManager implements Managed { this.metricRegistry = metricRegistry; } + public void setScheduler(final Scheduler scheduler) { + this.scheduler = scheduler; + } + public void setSearcherFactory(final SearcherFactory searcherFactory) { this.searcherFactory = searcherFactory; } @@ -225,7 +231,7 @@ public final class IndexManager implements Managed { .weigher(new IndexWeigher()) .expireAfterAccess(Duration.ofSeconds(idleSeconds)) .refreshAfterWrite(Duration.ofSeconds(commitIntervalSeconds)) - .scheduler(Scheduler.systemScheduler()) + .scheduler(scheduler) .evictionListener(new IndexEvictionListener()) .buildAsync(new AsyncIndexLoader()); lock = new StripedLock<String>(100); diff --git a/nouveau/src/test/java/org/apache/couchdb/nouveau/health/IndexHealthCheckTest.java b/nouveau/src/test/java/org/apache/couchdb/nouveau/health/IndexHealthCheckTest.java index 4bae7a7ad..7ee322313 100644 --- a/nouveau/src/test/java/org/apache/couchdb/nouveau/health/IndexHealthCheckTest.java +++ b/nouveau/src/test/java/org/apache/couchdb/nouveau/health/IndexHealthCheckTest.java @@ -17,6 +17,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import com.codahale.metrics.MetricRegistry; import com.fasterxml.jackson.databind.ObjectMapper; +import com.github.benmanes.caffeine.cache.Scheduler; import java.nio.file.Path; import org.apache.couchdb.nouveau.core.IndexManager; import org.apache.couchdb.nouveau.resources.IndexResource; @@ -33,6 +34,7 @@ public class IndexHealthCheckTest { manager.setObjectMapper(new ObjectMapper()); manager.setMetricRegistry(new MetricRegistry()); manager.setRootDir(tempDir); + manager.setScheduler(Scheduler.systemScheduler()); manager.setSearcherFactory(new SearcherFactory()); manager.start();
