From 141fb54370ac906eb41f05a1113b6c33ba006f48 Mon Sep 17 00:00:00 2001 From: Luca Cavanna Date: Sat, 14 Sep 2024 17:02:56 +0200 Subject: [PATCH] Remove CollectorManager#forSequentialExecution We have recently (see #13735) introduced this utility method that creates a collector manager which only works when a searcher does not have an executor set, otherwise it throws exception once we attempt to create a new collector for more than one slice. While we discussed it should be safe to use in some specific scenarios like the monitor module, we should be careful exposing this utility publicly, because while we'd like to ease migration from the search(Query, Collector) method, we may end up making users like even worse, in that it exposes them to failures whenever an executor is set and there are more than one slice created, which is hard to follow and does not provide a good user experience. My proposal is that we use a similar collector manager locally, where safe and required, but we don't expose it to users. In most places, we should rather expose collector managers that do support search concurrency, rather than working around the lack of those. --- lucene/CHANGES.txt | 3 -- .../lucene/search/CollectorManager.java | 34 ------------------- .../lucene/monitor/CollectingMatcher.java | 23 ++++++++++++- 3 files changed, 22 insertions(+), 38 deletions(-) diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt index d41f70801ca5..095c4895fe31 100644 --- a/lucene/CHANGES.txt +++ b/lucene/CHANGES.txt @@ -311,9 +311,6 @@ API Changes * GITHUB#13568, GITHUB#13750: Add DrillSideways#search method that supports any CollectorManagers for drill-sideways dimensions or drill-down. (Egor Potemkin) -* GITHUB#13735: Add CollectorManager#forSequentialExecution to make CollectorManager creation more convenient - for users of the deprecated IndexSearcher#search(Query, Collector). (Greg Miller) - New Features --------------------- diff --git a/lucene/core/src/java/org/apache/lucene/search/CollectorManager.java b/lucene/core/src/java/org/apache/lucene/search/CollectorManager.java index c33712b13218..3c87a94e36d9 100644 --- a/lucene/core/src/java/org/apache/lucene/search/CollectorManager.java +++ b/lucene/core/src/java/org/apache/lucene/search/CollectorManager.java @@ -18,8 +18,6 @@ import java.io.IOException; import java.util.Collection; -import java.util.concurrent.Executor; -import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.LeafReaderContext; /** @@ -55,36 +53,4 @@ public interface CollectorManager { * called after collection is finished on all provided collectors. */ T reduce(Collection collectors) throws IOException; - - /** - * Wrap a provided {@link Collector} with a thin {@code CollectorManager} wrapper for use with - * {@link IndexSearcher#search(Query, CollectorManager)} when doing single-threaded searching. The - * wrapping {@code CollectorManager} provides no {@link CollectorManager#reduce(Collection)} - * implementation, so the wrapped {@code Collector} needs to do all relevant work while - * collecting. - * - *

Note: This is only safe to use when {@code IndexSearcher} is created with no executor (see: - * {@link IndexSearcher#IndexSearcher(IndexReader, Executor)}). - */ - static CollectorManager forSequentialExecution(C in) { - return new CollectorManager() { - private boolean newCollectorInvoked; - - @Override - public C newCollector() { - if (newCollectorInvoked) { - throw new IllegalStateException( - "newCollector should be invoked at most once. Ensure your IndexSearcher has been created without an Executor."); - } - newCollectorInvoked = true; - return in; - } - - @Override - public Void reduce(Collection collectors) { - assert collectors.size() == 1 : "collectors should contain exactly one collector instance"; - return null; - } - }; - } } diff --git a/lucene/monitor/src/java/org/apache/lucene/monitor/CollectingMatcher.java b/lucene/monitor/src/java/org/apache/lucene/monitor/CollectingMatcher.java index 6175fec5ca33..c434672fd68d 100644 --- a/lucene/monitor/src/java/org/apache/lucene/monitor/CollectingMatcher.java +++ b/lucene/monitor/src/java/org/apache/lucene/monitor/CollectingMatcher.java @@ -18,6 +18,7 @@ package org.apache.lucene.monitor; import java.io.IOException; +import java.util.Collection; import java.util.Map; import org.apache.lucene.search.CollectorManager; import org.apache.lucene.search.IndexSearcher; @@ -38,9 +39,29 @@ abstract class CollectingMatcher extends CandidateMatcher< @Override public void matchQuery(final String queryId, Query matchQuery, Map metadata) throws IOException { + MatchCollector matchCollector = new MatchCollector(queryId, scoreMode); searcher.search( matchQuery, - CollectorManager.forSequentialExecution(new MatchCollector(queryId, scoreMode))); + new CollectorManager() { + boolean newCollectorInvoked = false; + + @Override + public MatchCollector newCollector() { + if (newCollectorInvoked) { + throw new IllegalStateException( + "newCollector should be invoked at most once. Ensure your IndexSearcher has been created without an Executor."); + } + newCollectorInvoked = true; + return matchCollector; + } + + @Override + public Void reduce(Collection collectors) { + assert collectors.size() == 1 + : "collectors should contain exactly one collector instance"; + return null; + } + }); } /**