This is an automated email from the ASF dual-hosted git repository.

gus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/solr.git


The following commit(s) were added to refs/heads/main by this push:
     new e5051e8bed8 SOLR-17298 verify that graph, join and rerank queries are 
unaffected by the use of multithreaded search and re-enable them. (#2625)
e5051e8bed8 is described below

commit e5051e8bed85646f268cb93af9305c0842e02c71
Author: Gus Heck <[email protected]>
AuthorDate: Thu Aug 15 00:22:33 2024 -0400

    SOLR-17298 verify that graph, join and rerank queries are unaffected by the 
use of multithreaded search and re-enable them. (#2625)
---
 .../apache/solr/search/MultiThreadedSearcher.java  | 68 ++--------------------
 .../org/apache/solr/search/SolrIndexSearcher.java  | 17 +-----
 2 files changed, 7 insertions(+), 78 deletions(-)

diff --git 
a/solr/core/src/java/org/apache/solr/search/MultiThreadedSearcher.java 
b/solr/core/src/java/org/apache/solr/search/MultiThreadedSearcher.java
index b56931a650e..03ad74579b7 100644
--- a/solr/core/src/java/org/apache/solr/search/MultiThreadedSearcher.java
+++ b/solr/core/src/java/org/apache/solr/search/MultiThreadedSearcher.java
@@ -24,22 +24,16 @@ import java.util.Collection;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.concurrent.ExecutionException;
-import java.util.function.Supplier;
 import org.apache.lucene.index.LeafReaderContext;
-import org.apache.lucene.index.Term;
-import org.apache.lucene.search.BooleanClause;
 import org.apache.lucene.search.Collector;
 import org.apache.lucene.search.CollectorManager;
 import org.apache.lucene.search.Query;
-import org.apache.lucene.search.QueryVisitor;
 import org.apache.lucene.search.ScoreMode;
 import org.apache.lucene.search.SimpleCollector;
 import org.apache.lucene.search.TopDocs;
 import org.apache.lucene.search.TopDocsCollector;
 import org.apache.lucene.search.TopFieldDocs;
 import org.apache.lucene.util.FixedBitSet;
-import org.apache.lucene.util.automaton.ByteRunAutomaton;
-import org.apache.solr.search.join.GraphQuery;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -119,63 +113,11 @@ public class MultiThreadedSearcher {
     return new SearchResult(scoreMode, ret);
   }
 
-  static boolean allowMT(DelegatingCollector postFilter, QueryCommand cmd, 
Query query) {
-    if (postFilter != null || cmd.getSegmentTerminateEarly() || 
!cmd.getMultiThreaded()) {
-      return false;
-    } else {
-      MTCollectorQueryCheck allowMT = new MTCollectorQueryCheck();
-      query.visit(allowMT);
-      return allowMT.allowed();
-    }
-  }
-
-  /**
-   * A {@link QueryVisitor} that recurses through the query tree, determining 
if all queries support
-   * multi-threaded collecting.
-   */
-  private static class MTCollectorQueryCheck extends QueryVisitor {
-
-    private QueryVisitor subVisitor = this;
-
-    private boolean allowMt(Query query) {
-      if (query instanceof RankQuery || query instanceof GraphQuery || query 
instanceof JoinQuery) {
-        return false;
-      }
-      return true;
-    }
-
-    @Override
-    public void consumeTerms(Query query, Term... terms) {
-      if (!allowMt(query)) {
-        subVisitor = EMPTY_VISITOR;
-      }
-    }
-
-    @Override
-    public void consumeTermsMatching(
-        Query query, String field, Supplier<ByteRunAutomaton> automaton) {
-      if (!allowMt(query)) {
-        subVisitor = EMPTY_VISITOR;
-      } else {
-        super.consumeTermsMatching(query, field, automaton);
-      }
-    }
-
-    @Override
-    public void visitLeaf(Query query) {
-      if (!allowMt(query)) {
-        subVisitor = EMPTY_VISITOR;
-      }
-    }
-
-    @Override
-    public QueryVisitor getSubVisitor(BooleanClause.Occur occur, Query parent) 
{
-      return subVisitor;
-    }
-
-    public boolean allowed() {
-      return subVisitor != EMPTY_VISITOR;
-    }
+  static boolean allowMT(DelegatingCollector postFilter, QueryCommand cmd) {
+    // TODO: it's unclear if segmentTerminateEarly is truly incompatible but
+    //  since it has to appropriately denote partial results this needs to be
+    //  investigated/tested before we can remove this check (perhaps for 9.8).
+    return postFilter == null && !cmd.getSegmentTerminateEarly() && 
cmd.getMultiThreaded();
   }
 
   static class MaxScoreResult {
diff --git a/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java 
b/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java
index db3940f464e..59830187f41 100644
--- a/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java
+++ b/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java
@@ -752,19 +752,6 @@ public class SolrIndexSearcher extends IndexSearcher 
implements Closeable, SolrI
     }
   }
 
-  /**
-   * Thrown when {@link 
org.apache.solr.common.params.CommonParams#TIME_ALLOWED} is exceeded.
-   * Further, from the low level Lucene {@code 
org.apache.lucene.search.TimeLimitingBulkScorer}.
-   * Extending {@code ExitableDirectoryReader.ExitingReaderException} is for 
legacy reasons.
-   */
-  public static class LimitExceededFromScorerException
-      extends ExitableDirectoryReader.ExitingReaderException {
-
-    public LimitExceededFromScorerException(String msg) {
-      super(msg);
-    }
-  }
-
   /**
    * Retrieve the {@link Document} instance corresponding to the document id.
    *
@@ -1920,7 +1907,7 @@ public class SolrIndexSearcher extends IndexSearcher 
implements Closeable, SolrI
       }
       final TopDocs topDocs;
       final ScoreMode scoreModeUsed;
-      if (!MultiThreadedSearcher.allowMT(pf.postFilter, cmd, query)) {
+      if (!MultiThreadedSearcher.allowMT(pf.postFilter, cmd)) {
         log.trace("SINGLE THREADED search, skipping collector manager in 
getDocListNC");
         final TopDocsCollector<?> topCollector = buildTopDocsCollector(len, 
cmd);
         MaxScoreCollector maxScoreCollector = null;
@@ -2041,7 +2028,7 @@ public class SolrIndexSearcher extends IndexSearcher 
implements Closeable, SolrI
       qr.setNextCursorMark(cmd.getCursorMark());
     } else {
       final TopDocs topDocs;
-      if (!MultiThreadedSearcher.allowMT(pf.postFilter, cmd, query)) {
+      if (!MultiThreadedSearcher.allowMT(pf.postFilter, cmd)) {
         log.trace("SINGLE THREADED search, skipping collector manager in 
getDocListAndSetNC");
 
         @SuppressWarnings({"rawtypes"})

Reply via email to