From f5d3474966ca09fe4506d15d50bef4986e64417d Mon Sep 17 00:00:00 2001 From: Andrea Cavalli Date: Tue, 7 Sep 2021 02:08:29 +0200 Subject: [PATCH] Fix possible deadlock --- .../dbengine/database/memory/LLMemoryDictionary.java | 3 +++ .../UnscoredUnsortedContinuousLuceneMultiSearcher.java | 9 +++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/java/it/cavallium/dbengine/database/memory/LLMemoryDictionary.java b/src/main/java/it/cavallium/dbengine/database/memory/LLMemoryDictionary.java index 2992eb3..dd570f1 100644 --- a/src/main/java/it/cavallium/dbengine/database/memory/LLMemoryDictionary.java +++ b/src/main/java/it/cavallium/dbengine/database/memory/LLMemoryDictionary.java @@ -178,6 +178,9 @@ public class LLMemoryDictionary implements LLDictionary { boolean existsAlmostCertainly) { return Mono.usingWhen(keyMono, key -> Mono.fromCallable(() -> { + if (updateMode == UpdateMode.DISALLOW) { + throw new UnsupportedOperationException("update() is disallowed"); + } AtomicReference> oldRef = new AtomicReference<>(null); var newValue = mainDb.compute(k(key), (_unused, old) -> { if (old != null) { diff --git a/src/main/java/it/cavallium/dbengine/lucene/searcher/UnscoredUnsortedContinuousLuceneMultiSearcher.java b/src/main/java/it/cavallium/dbengine/lucene/searcher/UnscoredUnsortedContinuousLuceneMultiSearcher.java index 4af29f3..34828b0 100644 --- a/src/main/java/it/cavallium/dbengine/lucene/searcher/UnscoredUnsortedContinuousLuceneMultiSearcher.java +++ b/src/main/java/it/cavallium/dbengine/lucene/searcher/UnscoredUnsortedContinuousLuceneMultiSearcher.java @@ -25,9 +25,14 @@ import reactor.core.publisher.Sinks.EmitResult; import reactor.core.publisher.Sinks.Many; import reactor.core.scheduler.Scheduler; import reactor.core.scheduler.Schedulers; +import reactor.util.concurrent.Queues; public class UnscoredUnsortedContinuousLuceneMultiSearcher implements LuceneMultiSearcher { + private static final Scheduler UNSCORED_UNSORTED_EXECUTOR = Schedulers.newBoundedElastic(Runtime + .getRuntime() + .availableProcessors(), Schedulers.DEFAULT_BOUNDED_ELASTIC_QUEUESIZE, "UnscoredUnsortedExecutor"); + @Override public Mono createShardSearcher(LocalQueryParams queryParams) { return Mono @@ -62,7 +67,7 @@ public class UnscoredUnsortedContinuousLuceneMultiSearcher implements LuceneMult } @Override - protected void doSetNextReader(LeafReaderContext context) throws IOException { + protected void doSetNextReader(LeafReaderContext context) { this.context = context; } @@ -109,7 +114,7 @@ public class UnscoredUnsortedContinuousLuceneMultiSearcher implements LuceneMult } collector.setShardIndex(collectorShardIndex); remainingCollectors.incrementAndGet(); - Schedulers.boundedElastic().schedule(() -> { + UNSCORED_UNSORTED_EXECUTOR.schedule(() -> { try { indexSearcher.search(queryParams.query(), collector);