You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by mk...@apache.org on 2019/03/05 20:29:06 UTC

[lucene-solr] branch branch_8x updated: SOLR-9882: picking results for mergeIds even after partial ones occurred

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

mkhl pushed a commit to branch branch_8x
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git


The following commit(s) were added to refs/heads/branch_8x by this push:
     new 76df3ac  SOLR-9882: picking results for mergeIds even after partial ones occurred
76df3ac is described below

commit 76df3ac75d8f4638c6044c578a9970f1f89a87ab
Author: Mikhail Khludnev <mk...@apache.org>
AuthorDate: Tue Mar 5 23:21:12 2019 +0300

    SOLR-9882: picking results for mergeIds even after partial ones occurred
---
 .../apache/solr/handler/component/QueryComponent.java  | 18 +++++++++++-------
 .../src/test/org/apache/solr/TestTolerantSearch.java   | 10 +++++-----
 2 files changed, 16 insertions(+), 12 deletions(-)

diff --git a/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java b/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java
index 4dab304..fea238b 100644
--- a/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java
+++ b/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java
@@ -812,7 +812,7 @@ public class QueryComponent extends SearchComponent
       
       long numFound = 0;
       Float maxScore=null;
-      boolean partialResults = false;
+      boolean thereArePartialResults = false;
       Boolean segmentTerminatedEarly = null;
       for (ShardResponse srsp : sreq.responses) {
         SolrDocumentList docs = null;
@@ -853,7 +853,7 @@ public class QueryComponent extends SearchComponent
         }
         // now that we've added the shard info, let's only proceed if we have no error.
         if (srsp.getException() != null) {
-          partialResults = true;
+          thereArePartialResults = true;
           continue;
         }
 
@@ -865,10 +865,11 @@ public class QueryComponent extends SearchComponent
           responseHeader = (NamedList<?>)srsp.getSolrResponse().getResponse().get("responseHeader");
         }
 
+        final boolean thisResponseIsPartial;
         if (responseHeader != null) {
-          if (Boolean.TRUE.equals(responseHeader.getBooleanArg(SolrQueryResponse.RESPONSE_HEADER_PARTIAL_RESULTS_KEY))) {
-            partialResults = true;
-          }
+          thisResponseIsPartial = Boolean.TRUE.equals(responseHeader.getBooleanArg(SolrQueryResponse.RESPONSE_HEADER_PARTIAL_RESULTS_KEY));
+          thereArePartialResults |= thisResponseIsPartial;
+          
           if (!Boolean.TRUE.equals(segmentTerminatedEarly)) {
             final Object ste = responseHeader.get(SolrQueryResponse.RESPONSE_HEADER_SEGMENT_TERMINATED_EARLY_KEY);
             if (Boolean.TRUE.equals(ste)) {
@@ -877,6 +878,8 @@ public class QueryComponent extends SearchComponent
               segmentTerminatedEarly = Boolean.FALSE;
             }
           }
+        } else {
+          thisResponseIsPartial = false;
         }
         
         // calculate global maxScore and numDocsFound
@@ -886,7 +889,8 @@ public class QueryComponent extends SearchComponent
         numFound += docs.getNumFound();
 
         NamedList sortFieldValues = (NamedList)(srsp.getSolrResponse().getResponse().get("sort_values"));
-        if (sortFieldValues.size()==0 && partialResults) {
+        if (sortFieldValues.size()==0 && // we bypass merging this response only if it's partial itself
+                            thisResponseIsPartial) { // but not the previous one!!
           continue; //fsv timeout yields empty sort_vlaues
         }
         NamedList unmarshalledSortFieldValues = unmarshalSortValues(ss, sortFieldValues, schema);
@@ -966,7 +970,7 @@ public class QueryComponent extends SearchComponent
 
       populateNextCursorMarkFromMergedShards(rb);
 
-      if (partialResults) {
+      if (thereArePartialResults) {
          rb.rsp.getResponseHeader().asShallowMap()
                    .put(SolrQueryResponse.RESPONSE_HEADER_PARTIAL_RESULTS_KEY, Boolean.TRUE);
       }
diff --git a/solr/core/src/test/org/apache/solr/TestTolerantSearch.java b/solr/core/src/test/org/apache/solr/TestTolerantSearch.java
index 44c8bf6..afde390 100644
--- a/solr/core/src/test/org/apache/solr/TestTolerantSearch.java
+++ b/solr/core/src/test/org/apache/solr/TestTolerantSearch.java
@@ -16,6 +16,10 @@
  */
 package org.apache.solr;
 
+import java.io.File;
+import java.io.IOException;
+import java.io.OutputStream;
+
 import org.apache.commons.io.FileUtils;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrQuery;
@@ -33,10 +37,6 @@ import org.apache.solr.response.SolrQueryResponse;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 
-import java.io.File;
-import java.io.IOException;
-import java.io.OutputStream;
-
 public class TestTolerantSearch extends SolrJettyTestBase {
   
   private static SolrClient collection1;
@@ -194,7 +194,7 @@ public class TestTolerantSearch extends SolrJettyTestBase {
       }
     }
     assertTrue(foundError);
-    
+    assertFalse(""+response, response.getResults().isEmpty());
     assertEquals("1", response.getResults().get(0).getFieldValue("id"));
     assertEquals("batman", response.getResults().get(0).getFirstValue("subject"));
     unIgnoreException("Dummy exception in BadResponseWriter");