You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by an...@apache.org on 2014/10/09 22:07:47 UTC

svn commit: r1630583 - in /lucene/dev/trunk/solr/core/src: java/org/apache/solr/handler/ java/org/apache/solr/handler/component/ java/org/apache/solr/search/ java/org/apache/solr/search/grouping/ test/org/apache/solr/ test/org/apache/solr/cloud/ test/o...

Author: anshum
Date: Thu Oct  9 20:07:46 2014
New Revision: 1630583

URL: http://svn.apache.org/r1630583
Log:
SOLR-5986: Fix tests and start returning partial results in case of ExitingReaderException

Modified:
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/MoreLikeThisHandler.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/SearchHandler.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/Grouping.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/grouping/CommandHandler.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/TestDistributedSearch.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/CloudExitableDirectoryReaderTest.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/core/ExitableDirectoryReaderTest.java

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/MoreLikeThisHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/MoreLikeThisHandler.java?rev=1630583&r1=1630582&r2=1630583&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/MoreLikeThisHandler.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/MoreLikeThisHandler.java Thu Oct  9 20:07:46 2014
@@ -54,6 +54,8 @@ import org.apache.solr.search.SolrReturn
 import org.apache.solr.search.SortSpec;
 import org.apache.solr.search.SyntaxError;
 import org.apache.solr.util.SolrPluginUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
 import java.io.Reader;
@@ -77,6 +79,8 @@ public class MoreLikeThisHandler extends
 {
   // Pattern is thread safe -- TODO? share this with general 'fl' param
   private static final Pattern splitList = Pattern.compile(",| ");
+
+  protected static Logger log = LoggerFactory.getLogger(MoreLikeThisHandler.class);
   
   @Override
   public void init(NamedList args) {
@@ -267,8 +271,7 @@ public class MoreLikeThisHandler extends
           }
         }
       } catch (ExitableDirectoryReader.ExitingReaderException ex) {
-        throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
-            "MLTHandler Request took too long during query expansion. Terminating request.");
+        log.warn( "Query: " + req.getParamString() + "; " + ex.getMessage());
       } finally {
         SolrQueryTimeoutImpl.reset();
       }

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/SearchHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/SearchHandler.java?rev=1630583&r1=1630582&r2=1630583&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/SearchHandler.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/SearchHandler.java Thu Oct  9 20:07:46 2014
@@ -244,8 +244,6 @@ public class SearchHandler extends Reque
         }
       } catch (ExitableDirectoryReader.ExitingReaderException ex) {
         log.warn( "Query: " + req.getParamString() + "; " + ex.getMessage());
-        throw new SolrException(ErrorCode.BAD_REQUEST,
-            "Request took too long during query expansion. Terminating request.");
       } finally {
         SolrQueryTimeoutImpl.reset();
       }

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/Grouping.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/Grouping.java?rev=1630583&r1=1630582&r2=1630583&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/Grouping.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/Grouping.java Thu Oct  9 20:07:46 2014
@@ -27,6 +27,7 @@ import java.util.Map;
 import java.util.Set;
 
 import org.apache.commons.lang.ArrayUtils;
+import org.apache.lucene.index.ExitableDirectoryReader;
 import org.apache.lucene.index.StorableField;
 import org.apache.lucene.queries.function.FunctionQuery;
 import org.apache.lucene.queries.function.ValueSource;
@@ -452,6 +453,9 @@ public class Grouping {
     } catch (TimeLimitingCollector.TimeExceededException x) {
       logger.warn( "Query: " + query + "; " + x.getMessage() );
       qr.setPartialResults(true);
+    } catch (ExitableDirectoryReader.ExitingReaderException e) {
+      logger.warn( "Query: " + query + "; " + e.getMessage() );
+      qr.setPartialResults(true);
     }
   }
 

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java?rev=1630583&r1=1630582&r2=1630583&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java Thu Oct  9 20:07:46 2014
@@ -232,7 +232,10 @@ public class SolrIndexSearcher extends I
     catch( TimeLimitingCollector.TimeExceededException x ) {
       log.warn( "Query: " + query + "; " + x.getMessage() );
       qr.setPartialResults(true);
-    }        
+    } catch ( ExitableDirectoryReader.ExitingReaderException e) {
+      log.warn("Query: " + query + "; " + e.getMessage());
+      qr.setPartialResults(true);
+    }
   }
   
   public SolrIndexSearcher(SolrCore core, String path, IndexSchema schema, SolrIndexConfig config, String name,
@@ -1217,11 +1220,15 @@ public class SolrIndexSearcher extends I
   protected DocSet getDocSetNC(Query query, DocSet filter) throws IOException {
     DocSetCollector collector = new DocSetCollector(maxDoc()>>6, maxDoc());
 
-    if (filter==null) {
-      super.search(query,null,collector);
-    } else {
-      Filter luceneFilter = filter.getTopFilter();
-      super.search(query, luceneFilter, collector);
+    try {
+      if (filter == null) {
+        super.search(query, null, collector);
+      } else {
+        Filter luceneFilter = filter.getTopFilter();
+        super.search(query, luceneFilter, collector);
+      }
+    } catch ( ExitableDirectoryReader.ExitingReaderException e) {
+        log.warn("Query: " + query + "; " + e.getMessage());
     }
     return collector.getDocSet();
   }

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/grouping/CommandHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/grouping/CommandHandler.java?rev=1630583&r1=1630582&r2=1630583&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/grouping/CommandHandler.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/grouping/CommandHandler.java Thu Oct  9 20:07:46 2014
@@ -22,6 +22,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 
+import org.apache.lucene.index.ExitableDirectoryReader;
 import org.apache.lucene.queries.function.ValueSource;
 import org.apache.lucene.search.Collector;
 import org.apache.lucene.search.Filter;
@@ -230,6 +231,9 @@ public class CommandHandler {
     } catch (TimeLimitingCollector.TimeExceededException x) {
       partialResults = true;
       logger.warn( "Query: " + query + "; " + x.getMessage() );
+    } catch (ExitableDirectoryReader.ExitingReaderException e) {
+      partialResults = true;
+      logger.warn( "Query: " + query + "; " + e.getMessage() );
     }
 
     if (includeHitCount) {

Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/TestDistributedSearch.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/TestDistributedSearch.java?rev=1630583&r1=1630582&r2=1630583&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/TestDistributedSearch.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/TestDistributedSearch.java Thu Oct  9 20:07:46 2014
@@ -503,24 +503,17 @@ public class TestDistributedSearch exten
           ShardParams.SHARDS_TOLERANT, "true");
 
       // test group query
-      // TODO: Remove this? This doesn't make any real sense now that timeAllowed might trigger early
-      //       termination of the request during Terms enumeration/Query expansion.
-      //       During such an exit, partial results isn't supported as it wouldn't make any sense.
-      // Increasing the timeAllowed from 1 to 100 for now.
-      //
-      // TODO: still failing in jenkins - see SOLR-5986
-      //
-      // queryPartialResults(upShards, upClients,
-      //     "q", "*:*",
-      //     "rows", 100,
-      //     "fl", "id," + i1,
-      //     "group", "true",
-      //     "group.query", t1 + ":kings OR " + t1 + ":eggs",
-      //     "group.limit", 10,
-      //     "sort", i1 + " asc, id asc",
-      //     CommonParams.TIME_ALLOWED, 100,
-      //     ShardParams.SHARDS_INFO, "true",
-      //     ShardParams.SHARDS_TOLERANT, "true");
+      queryPartialResults(upShards, upClients,
+           "q", "*:*",
+           "rows", 100,
+           "fl", "id," + i1,
+           "group", "true",
+           "group.query", t1 + ":kings OR " + t1 + ":eggs",
+           "group.limit", 10,
+           "sort", i1 + " asc, id asc",
+           CommonParams.TIME_ALLOWED, 1,
+           ShardParams.SHARDS_INFO, "true",
+           ShardParams.SHARDS_TOLERANT, "true");
 
       queryPartialResults(upShards, upClients,
           "q", "*:*",

Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/CloudExitableDirectoryReaderTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/CloudExitableDirectoryReaderTest.java?rev=1630583&r1=1630582&r2=1630583&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/CloudExitableDirectoryReaderTest.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/CloudExitableDirectoryReaderTest.java Thu Oct  9 20:07:46 2014
@@ -20,15 +20,11 @@ package org.apache.solr.cloud;
 
 import org.apache.lucene.util.LuceneTestCase.Slow;
 import org.apache.lucene.util.TestUtil;
-import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.response.QueryResponse;
-import org.apache.solr.common.SolrException;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import static org.apache.solr.common.SolrException.ErrorCode;
-
 /**
 * Distributed test for {@link org.apache.lucene.index.ExitableDirectoryReader} 
 */
@@ -36,7 +32,7 @@ import static org.apache.solr.common.Sol
 public class CloudExitableDirectoryReaderTest extends AbstractFullDistribZkTestBase {
   public static Logger log = LoggerFactory.getLogger(CloudExitableDirectoryReaderTest.class);
   private static final int NUM_DOCS_PER_TYPE = 20;
-
+  
   public CloudExitableDirectoryReaderTest() {
     configString = "solrconfig-tlog-with-delayingcomponent.xml";
     schemaString = "schema.xml";
@@ -74,7 +70,7 @@ public class CloudExitableDirectoryReade
   }
 
   public void doTimeoutTests() throws Exception {
-    assertFail(params("q", "name:a*", "timeAllowed", "1"));
+    assertPartialResults(params("q", "name:a*", "timeAllowed", "1"));
 
     /*
     query rewriting for NUM_DOCS_PER_TYPE terms should take less 
@@ -86,7 +82,7 @@ public class CloudExitableDirectoryReade
     Long timeAllowed = TestUtil.nextLong(random(), fiveSeconds, Long.MAX_VALUE);
     assertSuccess(params("q", "name:a*", "timeAllowed",timeAllowed.toString()));
 
-    assertFail(params("q", "name:a*", "timeAllowed", "1"));
+    assertPartialResults(params("q", "name:a*", "timeAllowed", "1"));
 
     timeAllowed = TestUtil.nextLong(random(), fiveSeconds, Long.MAX_VALUE);
     assertSuccess(params("q", "name:b*", "timeAllowed",timeAllowed.toString()));
@@ -100,37 +96,14 @@ public class CloudExitableDirectoryReade
   /**
    * execute a request, verify that we get an expected error
    */
-  public void assertFail(ModifiableSolrParams p) throws Exception {
-    String timeoutMessage = "Request took too long during query expansion. Terminating request.";
-
-    try {
-      ignoreException(timeoutMessage);
-      queryServer(p);
-      fail("no exception matching expected: " + ErrorCode.BAD_REQUEST.code + ": " + timeoutMessage);
-    } catch (SolrServerException e) {
-      assertTrue("Exception " + e.getCause() + " is not a SolrException:\n" + prettyStackTrace(e.getCause()),
-          e.getCause() instanceof SolrException);
-      assertEquals(ErrorCode.BAD_REQUEST.code, ((SolrException)e.getCause()).code());
-      assertTrue("Expected error message substr not found: " + timeoutMessage + " <!< " + e.getMessage(),
-                 e.getMessage().contains(timeoutMessage));
-    } finally {
-      unIgnoreException(timeoutMessage);
-    }
+  public void assertPartialResults(ModifiableSolrParams p) throws Exception {
+      QueryResponse rsp = queryServer(p);
+      assertEquals("partialResults were expected", true, rsp.getHeader().get("partialResults"));
   }
   
   public void assertSuccess(ModifiableSolrParams p) throws Exception {
     QueryResponse response = queryServer(p);
     assertEquals("Wrong #docs in response", NUM_DOCS_PER_TYPE - 1, response.getResults().getNumFound());
   }
-
-  public String prettyStackTrace(Throwable t) {
-    StringBuilder builder = new StringBuilder();
-    for (StackTraceElement elem : t.getStackTrace()) {
-      builder.append("    at ");
-      builder.append(elem.toString());
-      builder.append('\n');
-    }
-    return builder.toString();
-  }
 }
 

Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/core/ExitableDirectoryReaderTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/core/ExitableDirectoryReaderTest.java?rev=1630583&r1=1630582&r2=1630583&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/core/ExitableDirectoryReaderTest.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/core/ExitableDirectoryReaderTest.java Thu Oct  9 20:07:46 2014
@@ -20,6 +20,8 @@ package org.apache.solr.core;
 
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.SolrException;
+import org.apache.solr.request.SolrQueryRequest;
+import org.apache.solr.response.SolrQueryResponse;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -31,6 +33,7 @@ public class ExitableDirectoryReaderTest
   
   static int NUM_DOCS_PER_TYPE = 100;
   static final String assertionString = "//result[@numFound='"+ (NUM_DOCS_PER_TYPE - 1) + "']";
+  static final String failureAssertionString = "/responseHeader/partialResults==true]";
 
   @BeforeClass
   public static void beforeClass() throws Exception {
@@ -57,16 +60,12 @@ public class ExitableDirectoryReaderTest
   }
 
   @Test
-  public void testPrefixQuery() {
-    assertQEx("", req("q","name:a*", "indent","true","timeAllowed","1")
-        , SolrException.ErrorCode.BAD_REQUEST
-    );
+  public void testPrefixQuery() throws Exception {
+    assertJQ(req("q", "name:a*", "indent", "true", "timeAllowed", "1"), failureAssertionString);
 
     assertQ(req("q","name:a*", "indent","true", "timeAllowed","10000"), assertionString);
 
-    assertQEx("", req("q","name:a*", "indent","true", "timeAllowed","1")
-        , SolrException.ErrorCode.BAD_REQUEST
-    );
+    assertJQ(req("q","name:a*", "indent","true", "timeAllowed","1"), failureAssertionString);
 
     assertQ(req("q","name:b*", "indent","true", "timeAllowed","10000"), assertionString);
 
@@ -78,18 +77,16 @@ public class ExitableDirectoryReaderTest
   }
   
   @Test
-  public void testQueriesOnDocsWithMultipleTerms() {
+  public void testQueriesOnDocsWithMultipleTerms() throws Exception {
     assertQ(req("q","name:dummy", "indent","true", "timeAllowed","10000"), assertionString);
 
     // This should pass even though this may take more than the 'timeAllowed' time, it doesn't take long
     // to iterate over 1 term (dummy).
-    assertQ(req("q","name:dummy", "indent","true", "timeAllowed","10000"), assertionString);
-
-    assertQEx("", req("q","name:doc*", "indent","true", "timeAllowed","1")
-        , SolrException.ErrorCode.BAD_REQUEST
-    );
+    assertQ(req("q", "name:dummy", "indent", "true", "timeAllowed", "10000"), assertionString);
 
+    assertJQ(req("q", "name:doc*", "indent", "true", "timeAllowed", "1"), failureAssertionString);
   }
+  
 }