You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by sh...@apache.org on 2017/06/21 07:10:46 UTC

[20/50] [abbrv] lucene-solr:feature/autoscaling: SOLR-10406: v2 API error messages list the URL request path as /solr/____v2/... when the original path was /v2/...

SOLR-10406: v2 API error messages list the URL request path as /solr/____v2/... when the original path was /v2/...


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/b1b566f5
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/b1b566f5
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/b1b566f5

Branch: refs/heads/feature/autoscaling
Commit: b1b566f57bba46cadae33bc8198246fa05609287
Parents: 294026f
Author: Cao Manh Dat <da...@apache.org>
Authored: Tue Jun 20 12:46:33 2017 +0700
Committer: Cao Manh Dat <da...@apache.org>
Committed: Tue Jun 20 12:46:33 2017 +0700

----------------------------------------------------------------------
 solr/CHANGES.txt                                |  2 ++
 .../java/org/apache/solr/api/V2HttpCall.java    | 27 +++++++++-----
 .../org/apache/solr/servlet/HttpSolrCall.java   |  2 +-
 .../solr/handler/V2ApiIntegrationTest.java      | 38 ++++++++++++++++++++
 .../solr/client/solrj/impl/HttpSolrClient.java  | 12 ++++---
 5 files changed, 68 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b1b566f5/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 15b86a2..b163a7f 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -149,6 +149,8 @@ New Features
 
 * SOLR-9989: Add support for PointFields in FacetModule (JSON Facets) (Cao Manh Dat)
 
+* SOLR-10406: v2 API error messages list the URL request path as /solr/____v2/... when the original path was /v2/... (Cao Manh Dat, noble)
+
 Bug Fixes
 ----------------------
 * SOLR-9262: Connection and read timeouts are being ignored by UpdateShardHandler after SOLR-4509.

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b1b566f5/solr/core/src/java/org/apache/solr/api/V2HttpCall.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/api/V2HttpCall.java b/solr/core/src/java/org/apache/solr/api/V2HttpCall.java
index 5e7c0b1..49d50e9 100644
--- a/solr/core/src/java/org/apache/solr/api/V2HttpCall.java
+++ b/solr/core/src/java/org/apache/solr/api/V2HttpCall.java
@@ -56,7 +56,6 @@ import org.slf4j.LoggerFactory;
 import static org.apache.solr.common.params.CommonParams.JSON;
 import static org.apache.solr.common.params.CommonParams.WT;
 import static org.apache.solr.servlet.SolrDispatchFilter.Action.ADMIN;
-import static org.apache.solr.servlet.SolrDispatchFilter.Action.PASSTHROUGH;
 import static org.apache.solr.servlet.SolrDispatchFilter.Action.PROCESS;
 import static org.apache.solr.common.util.PathTrie.getPathSegments;
 
@@ -76,7 +75,7 @@ public class V2HttpCall extends HttpSolrCall {
 
   protected void init() throws Exception {
     String path = this.path;
-    String fullPath = path = path.substring(7);//strip off '/____v2'
+    final String fullPath = path = path.substring(7);//strip off '/____v2'
     try {
       pieces = getPathSegments(path);
       if (pieces.size() == 0 || (pieces.size() == 1 && path.endsWith(CommonParams.INTROSPECT))) {
@@ -159,7 +158,7 @@ public class V2HttpCall extends HttpSolrCall {
       log.error("Error in init()", rte);
       throw rte;
     } finally {
-      if (api == null) action = PASSTHROUGH;
+      if (api == null) action = PROCESS;
       if (solrReq != null) solrReq.getContext().put(CommonParams.PATH, path);
     }
   }
@@ -309,16 +308,28 @@ public class V2HttpCall extends HttpSolrCall {
 
   @Override
   protected void handleAdmin(SolrQueryResponse solrResp) {
-    api.call(this.solrReq, solrResp);
+    try {
+      api.call(this.solrReq, solrResp);
+    } catch (Exception e) {
+      solrResp.setException(e);
+    }
   }
 
   @Override
   protected void execute(SolrQueryResponse rsp) {
-    try {
-      api.call(solrReq, rsp);
-    } catch (RuntimeException e) {
-      throw e;
+    SolrCore.preDecorateResponse(solrReq, rsp);
+    if (api == null) {
+      rsp.setException(new SolrException(SolrException.ErrorCode.NOT_FOUND,
+          "Cannot find correspond api for the path : " + solrReq.getContext().get(CommonParams.PATH)));
+    } else {
+      try {
+        api.call(solrReq, rsp);
+      } catch (Exception e) {
+        rsp.setException(e);
+      }
     }
+
+    SolrCore.postDecorateResponse(handler, solrReq, rsp);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b1b566f5/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java b/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java
index bf6c553..5542d4c 100644
--- a/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java
+++ b/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java
@@ -687,7 +687,7 @@ public class HttpSolrCall {
         solrReq = new SolrQueryRequestBase(core, solrParams) {
         };
       }
-      QueryResponseWriter writer = core.getQueryResponseWriter(solrReq);
+      QueryResponseWriter writer = getResponseWriter();
       writeResponse(solrResp, writer, Method.GET);
     } catch (Exception e) { // This error really does not matter
       exp = e;

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b1b566f5/solr/core/src/test/org/apache/solr/handler/V2ApiIntegrationTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/handler/V2ApiIntegrationTest.java b/solr/core/src/test/org/apache/solr/handler/V2ApiIntegrationTest.java
index 5a8d482..dac495e 100644
--- a/solr/core/src/test/org/apache/solr/handler/V2ApiIntegrationTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/V2ApiIntegrationTest.java
@@ -22,11 +22,15 @@ import java.io.IOException;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.solr.client.solrj.ResponseParser;
 import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.SolrServerException;
+import org.apache.solr.client.solrj.impl.BinaryResponseParser;
 import org.apache.solr.client.solrj.impl.CloudSolrClient;
+import org.apache.solr.client.solrj.impl.XMLResponseParser;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.request.V2Request;
+import org.apache.solr.client.solrj.response.DelegationTokenResponse;
 import org.apache.solr.client.solrj.response.V2Response;
 import org.apache.solr.cloud.SolrCloudTestCase;
 import org.apache.solr.common.params.ModifiableSolrParams;
@@ -57,6 +61,40 @@ public class V2ApiIntegrationTest extends SolrCloudTestCase {
     assertEquals(0, res.getStatus());
   }
 
+  private void testException(ResponseParser responseParser, int expectedCode, String path, String payload) throws IOException, SolrServerException {
+    V2Request v2Request = new V2Request.Builder(path)
+        .withMethod(SolrRequest.METHOD.POST)
+        .withPayload(payload)
+        .build();
+    v2Request.setResponseParser(responseParser);
+    V2Response response = v2Request.process(cluster.getSolrClient());
+    assertEquals(getStatus(response), expectedCode);
+  }
+
+  @Test
+  public void testException() throws Exception {
+    String notFoundPath = "/c/" + COLL_NAME + "/abccdef";
+    String incorrectPayload = "{rebalance-leaders: {maxAtOnce: abc, maxWaitSeconds: xyz}}";
+    testException(new XMLResponseParser(),404,
+        notFoundPath, incorrectPayload);
+    testException(new DelegationTokenResponse.JsonMapResponseParser(),404,
+        notFoundPath, incorrectPayload);
+    testException(new BinaryResponseParser(),404,
+        notFoundPath, incorrectPayload);
+    testException(new XMLResponseParser(), 400, "/c/" + COLL_NAME, incorrectPayload);
+    testException(new BinaryResponseParser(), 400, "/c/" + COLL_NAME, incorrectPayload);
+    testException(new DelegationTokenResponse.JsonMapResponseParser(), 400, "/c/" + COLL_NAME, incorrectPayload);
+  }
+
+  private long getStatus(V2Response response) {
+    Object header = response.getResponse().get("responseHeader");
+    if (header instanceof NamedList) {
+      return (int) ((NamedList) header).get("status");
+    } else {
+      return (long) ((Map) header).get("status");
+    }
+  }
+
   @Test
   public void testIntrospect() throws Exception {
     ModifiableSolrParams params = new ModifiableSolrParams();

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b1b566f5/solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpSolrClient.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpSolrClient.java b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpSolrClient.java
index 104ab1f..fa1ccf1 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpSolrClient.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpSolrClient.java
@@ -228,7 +228,11 @@ public class HttpSolrClient extends SolrClient {
       throws SolrServerException, IOException {
     HttpRequestBase method = createMethod(request, collection);
     setBasicAuthHeader(request, method);
-    return executeMethod(method, processor);
+    return executeMethod(method, processor, isV2ApiRequest(request));
+  }
+
+  private boolean isV2ApiRequest(final SolrRequest request) {
+    return request instanceof V2Request || request.getPath().contains("/____v2");
   }
 
   private void setBasicAuthHeader(SolrRequest request, HttpRequestBase method) throws UnsupportedEncodingException {
@@ -268,7 +272,7 @@ public class HttpSolrClient extends SolrClient {
     ExecutorService pool = ExecutorUtil.newMDCAwareFixedThreadPool(1, new SolrjNamedThreadFactory("httpUriRequest"));
     try {
       MDC.put("HttpSolrClient.url", baseUrl);
-      mrr.future = pool.submit(() -> executeMethod(method, processor));
+      mrr.future = pool.submit(() -> executeMethod(method, processor, isV2ApiRequest(request)));
  
     } finally {
       pool.shutdown();
@@ -473,7 +477,7 @@ public class HttpSolrClient extends SolrClient {
 
   }
   
-  protected NamedList<Object> executeMethod(HttpRequestBase method, final ResponseParser processor) throws SolrServerException {
+  protected NamedList<Object> executeMethod(HttpRequestBase method, final ResponseParser processor, final boolean isV2Api) throws SolrServerException {
     method.addHeader("User-Agent", AGENT);
  
     org.apache.http.client.config.RequestConfig.Builder requestConfigBuilder = HttpClientUtil.createDefaultRequestConfigBuilder();
@@ -571,7 +575,7 @@ public class HttpSolrClient extends SolrClient {
       } catch (Exception e) {
         throw new RemoteSolrException(baseUrl, httpStatus, e.getMessage(), e);
       }
-      if (httpStatus != HttpStatus.SC_OK) {
+      if (httpStatus != HttpStatus.SC_OK && !isV2Api) {
         NamedList<String> metadata = null;
         String reason = null;
         try {