You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ry...@apache.org on 2012/02/23 10:07:32 UTC

svn commit: r1292717 - in /lucene/dev/trunk/solr: ./ core/src/java/org/apache/solr/handler/component/ core/src/test/org/apache/solr/ solrj/src/java/org/apache/solr/common/params/

Author: ryan
Date: Thu Feb 23 09:07:31 2012
New Revision: 1292717

URL: http://svn.apache.org/viewvc?rev=1292717&view=rev
Log:
SOLR-3134: Include shard info in distributed response when shards.info=true

Modified:
    lucene/dev/trunk/solr/CHANGES.txt
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/HttpShardHandler.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/SearchHandler.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/TestDistributedSearch.java
    lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/params/ShardParams.java

Modified: lucene/dev/trunk/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/CHANGES.txt?rev=1292717&r1=1292716&r2=1292717&view=diff
==============================================================================
--- lucene/dev/trunk/solr/CHANGES.txt (original)
+++ lucene/dev/trunk/solr/CHANGES.txt Thu Feb 23 09:07:31 2012
@@ -1,4 +1,4 @@
-                      Apache Solr Release Notes
+                      Apache Solr Release Notes
 
 Introduction
 ------------
@@ -227,6 +227,8 @@ New Features
 * SOLR-2459: Expose LogLevel selection with a RequestHandler rather then servlet
   (Stefan Matheis, Upayavira, ryan)
 
+* SOLR-3134: Include shard info in distributed response when shards.info=true (ryan)
+
 
 Optimizations
 ----------------------

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/HttpShardHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/HttpShardHandler.java?rev=1292717&r1=1292716&r2=1292717&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/HttpShardHandler.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/HttpShardHandler.java Thu Feb 23 09:07:31 2012
@@ -39,12 +39,13 @@ import org.apache.solr.common.params.Sha
 import org.apache.solr.common.params.SolrParams;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.StrUtils;
-import org.apache.solr.core.CoreDescriptor;
-import org.apache.solr.request.SolrQueryRequest;
-
-import java.util.*;
-import java.util.concurrent.*;
-
+import org.apache.solr.core.CoreDescriptor;
+import org.apache.solr.request.SolrQueryRequest;
+
+import java.net.ConnectException;
+import java.util.*;
+import java.util.concurrent.*;
+
 public class HttpShardHandler extends ShardHandler {
 
   private HttpShardHandlerFactory httpShardHandlerFactory;
@@ -155,12 +156,15 @@ public class HttpShardHandler extends Sh
             ssr.nl = server.request(req);
           } else {
             LBHttpSolrServer.Rsp rsp = httpShardHandlerFactory.loadbalancer.request(new LBHttpSolrServer.Req(req, urls));
-            ssr.nl = rsp.getResponse();
-            srsp.setShardAddress(rsp.getServer());
-          }
-        } catch (Throwable th) {
-          srsp.setException(th);
-          if (th instanceof SolrException) {
+            ssr.nl = rsp.getResponse();
+            srsp.setShardAddress(rsp.getServer());
+          }
+        }
+        catch( ConnectException cex ) {
+          srsp.setException(cex); //????
+        } catch (Throwable th) {
+          srsp.setException(th);
+          if (th instanceof SolrException) {
             srsp.setResponseCode(((SolrException)th).code());
           } else {
             srsp.setResponseCode(-1);
@@ -245,13 +249,13 @@ public class HttpShardHandler extends Sh
     String shards = params.get(ShardParams.SHARDS);
 
     // for back compat, a shards param with URLs like localhost:8983/solr will mean that this
-    // search is distributed.
-    boolean hasShardURL = shards != null && shards.indexOf('/') > 0;
-    rb.isDistrib = hasShardURL | rb.isDistrib;
-
-    if (rb.isDistrib) {
-      // since the cost of grabbing cloud state is still up in the air, we grab it only
-      // if we need it.
+    // search is distributed.
+    boolean hasShardURL = shards != null && shards.indexOf('/') > 0;
+    rb.isDistrib = hasShardURL | rb.isDistrib;
+    
+    if (rb.isDistrib) {
+      // since the cost of grabbing cloud state is still up in the air, we grab it only
+      // if we need it.
       CloudState cloudState = null;
       Map<String,Slice> slices = null;
       CoreDescriptor coreDescriptor = req.getCore().getCoreDescriptor();

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java?rev=1292717&r1=1292716&r2=1292717&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java Thu Feb 23 09:07:31 2012
@@ -44,6 +44,7 @@ import org.apache.solr.common.cloud.ZkNo
 import org.apache.solr.common.cloud.ZkStateReader;
 import org.apache.solr.common.params.*;
 import org.apache.solr.common.util.NamedList;
+import org.apache.solr.common.util.SimpleOrderedMap;
 import org.apache.solr.common.util.StrUtils;
 import org.apache.solr.core.CoreDescriptor;
 import org.apache.solr.request.SolrQueryRequest;
@@ -768,11 +769,28 @@ public class QueryComponent extends Sear
       ShardFieldSortedHitQueue queue;
       queue = new ShardFieldSortedHitQueue(sortFields, ss.getOffset() + ss.getCount());
 
+      NamedList<Object> shardInfo = null;
+      if(rb.req.getParams().getBool(ShardParams.SHARDS_INFO, false)) {
+        shardInfo = (NamedList<Object>) rb.rsp.getValues().get(ShardParams.SHARDS_INFO);
+        if(shardInfo==null) {
+          shardInfo = new SimpleOrderedMap<Object>();
+          rb.rsp.getValues().add(ShardParams.SHARDS_INFO,shardInfo);
+        }
+      }
+      
       long numFound = 0;
       Float maxScore=null;
       for (ShardResponse srsp : sreq.responses) {
         SolrDocumentList docs = (SolrDocumentList)srsp.getSolrResponse().getResponse().get("response");
 
+        if(shardInfo!=null) {
+          SimpleOrderedMap<Object> nl = new SimpleOrderedMap<Object>();
+          nl.add("numFound", docs.getNumFound());
+          nl.add("maxScore", docs.getMaxScore());
+          nl.add("time", srsp.getSolrResponse().getElapsedTime());
+          shardInfo.add(srsp.getShard(), nl);
+        }
+        
         // calculate global maxScore and numDocsFound
         if (docs.getMaxScore() != null) {
           maxScore = maxScore==null ? docs.getMaxScore() : Math.max(maxScore, docs.getMaxScore());

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=1292717&r1=1292716&r2=1292717&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 Feb 23 09:07:31 2012
@@ -18,11 +18,14 @@
 package org.apache.solr.handler.component;
 
 import org.apache.lucene.queryparser.classic.ParseException;
+import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.params.ShardParams;
+import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.RTimer;
+import org.apache.solr.common.util.SimpleOrderedMap;
 import org.apache.solr.core.CloseHook;
 import org.apache.solr.core.PluginInfo;
 import org.apache.solr.core.SolrCore;
@@ -35,6 +38,8 @@ import org.apache.solr.util.plugin.SolrC
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.io.PrintWriter;
+import java.io.StringWriter;
 import java.util.*;
 
 /**
@@ -283,14 +288,40 @@ public class SearchHandler extends Reque
             ShardResponse srsp = shardHandler1.takeCompletedOrError();
             if (srsp == null) break;  // no more requests to wait for
 
-            // Was there an exception?  If so, abort everything and
-            // rethrow
+            // Was there an exception?  
             if (srsp.getException() != null) {
-              shardHandler1.cancelAll();
-              if (srsp.getException() instanceof SolrException) {
-                throw (SolrException)srsp.getException();
-              } else {
-                throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, srsp.getException());
+              // If things are tolerant, just continue
+              if(rb.req.getParams().getBool(ShardParams.SHARDS_TOLERANT, false)) {
+                if( rb.req.getParams().getBool(ShardParams.SHARDS_INFO, false) ) {
+                  NamedList<Object> sinfo = (NamedList<Object>) rb.rsp.getValues().get(ShardParams.SHARDS_INFO);
+                  if(sinfo==null) {
+                    sinfo = new SimpleOrderedMap<Object>();
+                    rb.rsp.getValues().add(ShardParams.SHARDS_INFO,sinfo);
+                  }
+  
+                  SimpleOrderedMap<Object> nl = new SimpleOrderedMap<Object>();
+                  Throwable t = srsp.getException();
+                  if(t instanceof SolrServerException) {
+                    t = ((SolrServerException)t).getCause();
+                  }
+                  nl.add("error", t.toString() );
+                  
+                  StringWriter trace = new StringWriter();
+                  t.printStackTrace(new PrintWriter(trace));
+                  nl.add("trace", trace.toString() );
+                  if(srsp.getSolrResponse()!=null){
+                    nl.add("time", srsp.getSolrResponse().getElapsedTime());
+                  }
+                  sinfo.add(srsp.getShard(), nl);
+                }
+              }
+              else { // If so, abort everything and rethrow
+                shardHandler1.cancelAll();
+                if (srsp.getException() instanceof SolrException) {
+                  throw (SolrException)srsp.getException();
+                } else {
+                  throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, srsp.getException());
+                }
               }
             }
 

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=1292717&r1=1292716&r2=1292717&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 Feb 23 09:07:31 2012
@@ -17,7 +17,12 @@
 
 package org.apache.solr;
 
+import org.apache.commons.lang.StringUtils;
+import org.apache.solr.client.solrj.response.QueryResponse;
 import org.apache.solr.common.params.CommonParams;
+import org.apache.solr.common.params.ModifiableSolrParams;
+import org.apache.solr.common.params.ShardParams;
+import org.apache.solr.common.util.NamedList;
 
 /**
  * TODO? perhaps use:
@@ -274,6 +279,22 @@ public class TestDistributedSearch exten
     query("q", "id:[1 TO 5]", CommonParams.DEBUG, CommonParams.RESULTS);
     query("q", "id:[1 TO 5]", CommonParams.DEBUG, CommonParams.QUERY);
 
+    // Check Info is added to for each shard
+    ModifiableSolrParams q = new ModifiableSolrParams();
+    q.set("q", "*:*");
+    q.set(ShardParams.SHARDS_INFO, true);
+    setDistributedParams(q);
+    QueryResponse rsp = queryServer(q);
+    NamedList<?> sinfo = (NamedList<?>) rsp.getResponse().get(ShardParams.SHARDS_INFO);
+    String shards = getShardsString();
+    int cnt = StringUtils.countMatches(shards, ",")+1;
+    
+    assertNotNull("missing shard info", sinfo);
+    assertEquals("should have an entry for each shard ["+sinfo+"] "+shards, cnt, sinfo.size());
+    
+    
+    // This index has the same number for every field
+    
     // TODO: This test currently fails because debug info is obtained only
     // on shards with matches.
     // query("q","matchesnothing","fl","*,score", "debugQuery", "true");

Modified: lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/params/ShardParams.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/params/ShardParams.java?rev=1292717&r1=1292716&r2=1292717&view=diff
==============================================================================
--- lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/params/ShardParams.java (original)
+++ lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/params/ShardParams.java Thu Feb 23 09:07:31 2012
@@ -39,4 +39,10 @@ public interface ShardParams {
   
   /** query type for shard requests */
   public static final String SHARDS_QT = "shards.qt";
+  
+  /** Request detailed match info for each shard (true/false) */
+  public static final String SHARDS_INFO = "shards.info";
+
+  /** Should things fail if there is an error? (true/false) */
+  public static final String SHARDS_TOLERANT = "shards.tolerant";
 }