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);