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

liubao pushed a commit to branch master
in repository 
https://gitbox.apache.org/repos/asf/incubator-servicecomb-java-chassis.git


The following commit(s) were added to refs/heads/master by this push:
     new cc3a6a0  [SCB-996]When retries fail, return the last error
cc3a6a0 is described below

commit cc3a6a05ce08bace0d194192120435a4fc532a80
Author: liubao <[email protected]>
AuthorDate: Tue Oct 30 20:51:16 2018 +0800

    [SCB-996]When retries fail, return the last error
---
 .../demo/springmvc/client/SpringmvcClient.java     | 10 ++++++++++
 .../demo/springmvc/server/ControllerImpl.java      |  5 +++++
 .../servicecomb/loadbalance/Configuration.java     |  4 ++--
 .../loadbalance/LoadbalanceHandler.java            | 22 +++++++++++++++++++---
 4 files changed, 36 insertions(+), 5 deletions(-)

diff --git 
a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/SpringmvcClient.java
 
b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/SpringmvcClient.java
index 1da2e7c..ae545eb 100644
--- 
a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/SpringmvcClient.java
+++ 
b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/SpringmvcClient.java
@@ -210,6 +210,16 @@ public class SpringmvcClient {
             String.class,
             "hello 中国"));
 
+    try {
+      template.postForObject(prefix + "/controller/sayhello/{name}",
+          null,
+          String.class,
+          "exception");
+      TestMgr.check(true, false);
+    } catch (InvocationException e) {
+      TestMgr.check(e.getStatusCode(), 503);
+    }
+
     HttpHeaders headers = new HttpHeaders();
     headers.add("name", "world");
     @SuppressWarnings("rawtypes")
diff --git 
a/demo/demo-springmvc/springmvc-server/src/main/java/org/apache/servicecomb/demo/springmvc/server/ControllerImpl.java
 
b/demo/demo-springmvc/springmvc-server/src/main/java/org/apache/servicecomb/demo/springmvc/server/ControllerImpl.java
index 3c68b97..46adbe6 100644
--- 
a/demo/demo-springmvc/springmvc-server/src/main/java/org/apache/servicecomb/demo/springmvc/server/ControllerImpl.java
+++ 
b/demo/demo-springmvc/springmvc-server/src/main/java/org/apache/servicecomb/demo/springmvc/server/ControllerImpl.java
@@ -22,9 +22,11 @@ import java.util.Arrays;
 import javax.servlet.http.HttpServletRequest;
 import javax.validation.constraints.Min;
 import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response.Status;
 
 import org.apache.servicecomb.demo.controller.Person;
 import org.apache.servicecomb.provider.rest.common.RestSchema;
+import org.apache.servicecomb.swagger.invocation.exception.InvocationException;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -44,6 +46,9 @@ public class ControllerImpl {
 
   @PostMapping(path = "/sayhello/{name}")
   public String sayHello(@PathVariable("name") String name) {
+    if ("exception".equals(name)) {
+      throw new InvocationException(Status.SERVICE_UNAVAILABLE, "");
+    }
     return "hello " + name;
   }
 
diff --git 
a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/Configuration.java
 
b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/Configuration.java
index c6aa420..fd3190f 100644
--- 
a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/Configuration.java
+++ 
b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/Configuration.java
@@ -243,8 +243,8 @@ public final class Configuration {
   }
 
   public int getContinuousFailureThreshold(String microservice) {
-    final int defaultValue = 2;
-    String p = getStringProperty("2",
+    final int defaultValue = 5;
+    String p = getStringProperty("5",
         PROP_ROOT + microservice + "." + FILTER_ISOLATION + 
FILTER_CONTINUOUS_FAILURE_THRESHOLD,
         PROP_ROOT + FILTER_ISOLATION + FILTER_CONTINUOUS_FAILURE_THRESHOLD);
     try {
diff --git 
a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/LoadbalanceHandler.java
 
b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/LoadbalanceHandler.java
index 707651d..d36c552 100644
--- 
a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/LoadbalanceHandler.java
+++ 
b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/LoadbalanceHandler.java
@@ -70,7 +70,8 @@ public class LoadbalanceHandler implements Handler {
   public static final String SERVICECOMB_SERVER_ENDPOINT = "scb-endpoint";
 
   public static final boolean supportDefinedEndpoint =
-      
DynamicPropertyFactory.getInstance().getBooleanProperty("servicecomb.loadbalance.userDefinedEndpoint.enabled",
 false).get();
+      DynamicPropertyFactory.getInstance()
+          
.getBooleanProperty("servicecomb.loadbalance.userDefinedEndpoint.enabled", 
false).get();
 
   // just a wrapper to make sure in retry mode to choose a different server.
   class RetryLoadBalancer implements ILoadBalancer {
@@ -317,14 +318,29 @@ public class LoadbalanceHandler implements Handler {
       @Override
       public void onExecutionFailed(ExecutionContext<Invocation> context, 
Throwable finalException,
           ExecutionInfo info) {
+        LOGGER.error("Invoke all server failed. Operation {}, e={}",
+            context.getRequest().getInvocationQualifiedName(), 
finalException.toString());
         if (orginExecutor != null) {
           orginExecutor.execute(() -> {
-            asyncResp.consumerFail(finalException);
+            fail(finalException);
           });
         } else {
-          asyncResp.consumerFail(finalException);
+          fail(finalException);
         }
       }
+
+      private void fail(Throwable finalException) {
+        int depth = 10;
+        Throwable t = finalException;
+        while (depth-- > 0) {
+          if (t instanceof InvocationException) {
+            asyncResp.consumerFail(t);
+            return;
+          }
+          t = finalException.getCause();
+        }
+        asyncResp.consumerFail(finalException);
+      }
     };
     List<ExecutionListener<Invocation, Response>> listeners = new 
ArrayList<>(0);
     listeners.add(listener);

Reply via email to