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/servicecomb-java-chassis.git


The following commit(s) were added to refs/heads/master by this push:
     new d63d1db  [SCB-2112]isolation recovery should be immediatly after 
success (#2059)
d63d1db is described below

commit d63d1dba9dd5695eab8b168df14debcf5afa41ce
Author: bao liu <[email protected]>
AuthorDate: Mon Nov 16 16:55:21 2020 +0800

    [SCB-2112]isolation recovery should be immediatly after success (#2059)
---
 .../discovery/EndpointDiscoveryFilter.java         |  3 +-
 .../discovery/TestEndpointDiscoveryFilter.java     |  4 +-
 .../client/CustomEndpointDiscoveryFilter.java      |  3 +-
 .../discovery/AbstractEndpointDiscoveryFilter.java |  5 ++-
 .../TestAbstractTransportDiscoveryFilter.java      |  3 +-
 .../servicecomb/loadbalance/Configuration.java     |  9 ++++
 .../loadbalance/ServiceCombLoadBalancerStats.java  |  4 +-
 .../servicecomb/loadbalance/ServiceCombServer.java | 13 ++++--
 .../loadbalance/ServiceCombServerStats.java        | 50 ++++++++++++++++------
 .../loadbalance/event/IsolationServerEvent.java    |  2 +-
 .../filter/IsolationDiscoveryFilter.java           |  5 ++-
 .../loadbalance/filter/ServerDiscoveryFilter.java  |  9 ++--
 .../loadbalance/TestLoadBalanceCreator.java        | 16 +++----
 .../loadbalance/TestLoadBalanceHandler2.java       | 16 +++----
 .../loadbalance/TestLoadbalanceHandler.java        |  6 +--
 .../TestServiceCombLoadBalancerStats.java          | 10 ++---
 .../loadbalance/TestServiceCombServer.java         |  6 +--
 .../loadbalance/TestServiceCombServerStats.java    | 10 ++---
 .../loadbalance/TestSessionSticknessRule.java      |  6 +--
 .../filter/IsolationDiscoveryFilterTest.java       | 10 +++--
 .../filter/TestServerDiscoveryFilter.java          | 13 ++++--
 21 files changed, 129 insertions(+), 74 deletions(-)

diff --git 
a/core/src/main/java/org/apache/servicecomb/core/registry/discovery/EndpointDiscoveryFilter.java
 
b/core/src/main/java/org/apache/servicecomb/core/registry/discovery/EndpointDiscoveryFilter.java
index a6c3efc..80c060e 100644
--- 
a/core/src/main/java/org/apache/servicecomb/core/registry/discovery/EndpointDiscoveryFilter.java
+++ 
b/core/src/main/java/org/apache/servicecomb/core/registry/discovery/EndpointDiscoveryFilter.java
@@ -43,7 +43,8 @@ public class EndpointDiscoveryFilter extends 
AbstractEndpointDiscoveryFilter {
   }
 
   @Override
-  protected Object createEndpoint(String transportName, String endpoint, 
MicroserviceInstance instance) {
+  protected Object createEndpoint(DiscoveryContext context, String 
transportName, String endpoint,
+      MicroserviceInstance instance) {
     Transport transport = 
SCBEngine.getInstance().getTransportManager().findTransport(transportName);
     if (transport == null) {
       LOGGER.info("not deployed transport {}, ignore {}.", transportName, 
endpoint);
diff --git 
a/core/src/test/java/org/apache/servicecomb/core/registry/discovery/TestEndpointDiscoveryFilter.java
 
b/core/src/test/java/org/apache/servicecomb/core/registry/discovery/TestEndpointDiscoveryFilter.java
index 461e15a..9afa690 100644
--- 
a/core/src/test/java/org/apache/servicecomb/core/registry/discovery/TestEndpointDiscoveryFilter.java
+++ 
b/core/src/test/java/org/apache/servicecomb/core/registry/discovery/TestEndpointDiscoveryFilter.java
@@ -78,7 +78,7 @@ public class TestEndpointDiscoveryFilter {
 
   @Test
   public void createEndpointNullTransport() {
-    Assert.assertNull(filter.createEndpoint(Const.RESTFUL, "", null));
+    Assert.assertNull(filter.createEndpoint(null, Const.RESTFUL, "", null));
   }
 
   @Test
@@ -95,7 +95,7 @@ public class TestEndpointDiscoveryFilter {
       }
     };
 
-    Endpoint ep = (Endpoint) filter.createEndpoint(Const.RESTFUL, endpoint, 
instance);
+    Endpoint ep = (Endpoint) filter.createEndpoint(null, Const.RESTFUL, 
endpoint, instance);
     Assert.assertSame(transport, ep.getTransport());
     Assert.assertSame(address, ep.getAddress());
     Assert.assertSame(instance, ep.getMicroserviceInstance());
diff --git 
a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/CustomEndpointDiscoveryFilter.java
 
b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/CustomEndpointDiscoveryFilter.java
index d5b4f11..aa3ee5d 100644
--- 
a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/CustomEndpointDiscoveryFilter.java
+++ 
b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/CustomEndpointDiscoveryFilter.java
@@ -30,7 +30,8 @@ public class CustomEndpointDiscoveryFilter extends 
AbstractEndpointDiscoveryFilt
   }
 
   @Override
-  protected Object createEndpoint(String transportName, String endpoint, 
MicroserviceInstance instance) {
+  protected Object createEndpoint(DiscoveryContext context, String 
transportName, String endpoint,
+      MicroserviceInstance instance) {
     return endpoint;
   }
 
diff --git 
a/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/discovery/AbstractEndpointDiscoveryFilter.java
 
b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/discovery/AbstractEndpointDiscoveryFilter.java
index db1d759..1aa2d61 100644
--- 
a/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/discovery/AbstractEndpointDiscoveryFilter.java
+++ 
b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/discovery/AbstractEndpointDiscoveryFilter.java
@@ -56,7 +56,7 @@ public abstract class AbstractEndpointDiscoveryFilter 
implements DiscoveryFilter
             continue;
           }
 
-          Object objEndpoint = createEndpoint(transportName, endpoint, 
instance);
+          Object objEndpoint = createEndpoint(context, transportName, 
endpoint, instance);
           if (objEndpoint == null) {
             continue;
           }
@@ -79,5 +79,6 @@ public abstract class AbstractEndpointDiscoveryFilter 
implements DiscoveryFilter
 
   protected abstract String findTransportName(DiscoveryContext context, 
DiscoveryTreeNode parent);
 
-  protected abstract Object createEndpoint(String transportName, String 
endpoint, MicroserviceInstance instance);
+  protected abstract Object createEndpoint(DiscoveryContext context, String 
transportName, String endpoint,
+      MicroserviceInstance instance);
 }
diff --git 
a/foundations/foundation-registry/src/test/java/org/apache/servicecomb/registry/discovery/TestAbstractTransportDiscoveryFilter.java
 
b/foundations/foundation-registry/src/test/java/org/apache/servicecomb/registry/discovery/TestAbstractTransportDiscoveryFilter.java
index 6d72947..c1f8da8 100644
--- 
a/foundations/foundation-registry/src/test/java/org/apache/servicecomb/registry/discovery/TestAbstractTransportDiscoveryFilter.java
+++ 
b/foundations/foundation-registry/src/test/java/org/apache/servicecomb/registry/discovery/TestAbstractTransportDiscoveryFilter.java
@@ -45,7 +45,8 @@ public class TestAbstractTransportDiscoveryFilter {
     }
 
     @Override
-    protected Object createEndpoint(String transportName, String endpoint, 
MicroserviceInstance instance) {
+    protected Object createEndpoint(DiscoveryContext context, String 
transportName, String endpoint,
+        MicroserviceInstance instance) {
       if (disableCreate) {
         return null;
       }
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 6ff3539..a31895a 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
@@ -64,6 +64,8 @@ public final class Configuration {
 
   public static final String FILTER_ENABLE_REQUEST = "enableRequestThreshold";
 
+  public static final String FILTER_RECOVER_IMMEDIATELY_WHEN_SUCCESS = 
"recoverImmediatelyWhenSuccess";
+
   public static final String FILTER_SINGLE_TEST = "singleTestTime";
 
   public static final String FILTER_MAX_SINGLE_TEST_WINDOW = 
"maxSingleTestWindow";
@@ -221,6 +223,13 @@ public final class Configuration {
     }
   }
 
+  public boolean isRecoverImmediatelyWhenSuccess(String microservice) {
+    String p = getStringProperty("true",
+        ROOT + microservice + "." + FILTER_ISOLATION + 
FILTER_RECOVER_IMMEDIATELY_WHEN_SUCCESS,
+        ROOT + FILTER_ISOLATION + FILTER_RECOVER_IMMEDIATELY_WHEN_SUCCESS);
+    return Boolean.parseBoolean(p);
+  }
+
   public Map<String, String> getFlowsplitFilterOptions(String microservice) {
     String keyPrefix = 
String.format(TRANSACTIONCONTROL_OPTIONS_PREFIX_PATTERN, microservice);
     return ConfigurePropertyUtils.getPropertiesWithPrefix(keyPrefix);
diff --git 
a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/ServiceCombLoadBalancerStats.java
 
b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/ServiceCombLoadBalancerStats.java
index f2cdfa9..bf40ec6 100644
--- 
a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/ServiceCombLoadBalancerStats.java
+++ 
b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/ServiceCombLoadBalancerStats.java
@@ -147,7 +147,7 @@ public class ServiceCombLoadBalancerStats {
             .build(
                 new CacheLoader<ServiceCombServer, ServiceCombServerStats>() {
                   public ServiceCombServerStats load(ServiceCombServer server) 
{
-                    ServiceCombServerStats stats = new 
ServiceCombServerStats();
+                    ServiceCombServerStats stats = new 
ServiceCombServerStats(server.getMicroserviceName());
                     pingView.put(server, stats);
                     
serviceCombServers.put(server.getInstance().getInstanceId(), server);
                     return stats;
@@ -166,7 +166,7 @@ public class ServiceCombLoadBalancerStats {
             ServiceCombServer server = 
serviceCombServerServiceCombServerStatsEntry.getKey();
             ServiceCombServerStats stats = 
serviceCombServerServiceCombServerStatsEntry.getValue();
             if ((System.currentTimeMillis() - stats.getLastVisitTime() > 
timerIntervalInMillis) && !ping
-                    .ping(server.getInstance())) {
+                .ping(server.getInstance())) {
               LOGGER.info("ping mark server {} failure.", 
server.getInstance().getInstanceId());
               stats.markFailure();
             }
diff --git 
a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/ServiceCombServer.java
 
b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/ServiceCombServer.java
index 47cb912..e9d1375 100644
--- 
a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/ServiceCombServer.java
+++ 
b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/ServiceCombServer.java
@@ -39,11 +39,14 @@ public class ServiceCombServer extends Server {
   // 所属服务实例
   private final MicroserviceInstance instance;
 
+  private final String microserviceName;
+
   @VisibleForTesting
-  ServiceCombServer(Endpoint endpoint, MicroserviceInstance instance) {
+  ServiceCombServer(String microserviceName, Endpoint endpoint, 
MicroserviceInstance instance) {
     super(null);
     this.endpoint = endpoint;
     this.instance = instance;
+    this.microserviceName = microserviceName;
 
     // Different types of Robin Component Rule have different usages for 
server status and list.
     // e.g. RoundRobinRule using getAllServers & alive & readyToServe
@@ -54,9 +57,9 @@ public class ServiceCombServer extends Server {
     this.setReadyToServe(true);
   }
 
-  public ServiceCombServer(Transport transport, CacheEndpoint cacheEndpoint) {
+  public ServiceCombServer(String microserviceName, Transport transport, 
CacheEndpoint cacheEndpoint) {
     super(null);
-
+    this.microserviceName = microserviceName;
     endpoint = new Endpoint(transport, cacheEndpoint.getEndpoint(), 
cacheEndpoint.getInstance());
     instance = cacheEndpoint.getInstance();
 
@@ -75,6 +78,10 @@ public class ServiceCombServer extends Server {
     }
   }
 
+  public String getMicroserviceName() {
+    return this.microserviceName;
+  }
+
   public Endpoint getEndpoint() {
     return endpoint;
   }
diff --git 
a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/ServiceCombServerStats.java
 
b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/ServiceCombServerStats.java
index 6afc0f6..d867da3 100644
--- 
a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/ServiceCombServerStats.java
+++ 
b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/ServiceCombServerStats.java
@@ -55,6 +55,8 @@ public class ServiceCombServerStats {
 
   private long lastActiveTime;
 
+  private long isolatedTime;
+
   private AtomicLong totalRequests;
 
   private AtomicLong successRequests;
@@ -63,13 +65,15 @@ public class ServiceCombServerStats {
 
   private boolean isolated = false;
 
-  public ServiceCombServerStats() {
-    this.clock = TimeUtils.getSystemDefaultZoneClock();
-    init();
+  private String microserviceName;
+
+  public ServiceCombServerStats(String microserviceName) {
+    this(microserviceName, TimeUtils.getSystemDefaultZoneClock());
   }
 
-  public ServiceCombServerStats(Clock clock) {
+  public ServiceCombServerStats(String microserviceName, Clock clock) {
     this.clock = clock;
+    this.microserviceName = microserviceName;
     init();
   }
 
@@ -117,19 +121,29 @@ public class ServiceCombServerStats {
 
   public void markIsolated(boolean isolated) {
     this.isolated = isolated;
+    this.isolatedTime = System.currentTimeMillis();
   }
 
   public void markSuccess() {
     long time = clock.millis();
     ensureWindow(time);
-    lastVisitTime = time;
-    lastActiveTime = time;
+
+    if (isolated) {
+      if 
(Configuration.INSTANCE.isRecoverImmediatelyWhenSuccess(microserviceName)
+          && time - this.isolatedTime > Configuration.INSTANCE
+          .getMinIsolationTime(microserviceName)) {
+        resetStats();
+        LOGGER.info("trying server invocation success, and reset stats.");
+      } else {
+        LOGGER.info("trying server invocation success!");
+      }
+    }
+
     totalRequests.incrementAndGet();
     successRequests.incrementAndGet();
     continuousFailureCount.set(0);
-    if (isolated) {
-      LOGGER.info("trying server invocation success!");
-    }
+    lastVisitTime = time;
+    lastActiveTime = time;
   }
 
   public void markFailure() {
@@ -150,10 +164,7 @@ public class ServiceCombServerStats {
       synchronized (lock) {
         if (time - lastWindow > TIME_WINDOW_IN_MILLISECONDS) {
           if (!isolated) {
-            continuousFailureCount.set(0);
-            totalRequests.set(0);
-            successRequests.set(0);
-            failedRequests.set(0);
+            resetStats();
           }
           lastWindow = time;
         }
@@ -161,15 +172,26 @@ public class ServiceCombServerStats {
     }
   }
 
+  private void resetStats() {
+    continuousFailureCount.set(0);
+    totalRequests.set(0);
+    successRequests.set(0);
+    failedRequests.set(0);
+  }
+
   public long getLastVisitTime() {
     return lastVisitTime;
   }
 
+  public long getIsolatedTime() {
+    return isolatedTime;
+  }
+
   public long getLastActiveTime() {
     return lastActiveTime;
   }
 
-  public long getCountinuousFailureCount() {
+  public long getContinuousFailureCount() {
     return continuousFailureCount.get();
   }
 
diff --git 
a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/event/IsolationServerEvent.java
 
b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/event/IsolationServerEvent.java
index 84adb78..115a161 100644
--- 
a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/event/IsolationServerEvent.java
+++ 
b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/event/IsolationServerEvent.java
@@ -57,7 +57,7 @@ public class IsolationServerEvent extends AlarmEvent {
     this.microserviceName = invocation.getMicroserviceName();
     this.endpoint = endpoint;
     this.currentTotalRequest = serverStats.getTotalRequests();
-    this.currentCountinuousFailureCount = 
serverStats.getCountinuousFailureCount();
+    this.currentCountinuousFailureCount = 
serverStats.getContinuousFailureCount();
     this.currentErrorPercentage = serverStats.getFailedRate();
     this.minIsolationTime = settings.minIsolationTime;
     this.enableRequestThreshold = settings.enableRequestThreshold;
diff --git 
a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/filter/IsolationDiscoveryFilter.java
 
b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/filter/IsolationDiscoveryFilter.java
index 46dec17..c8693d9 100644
--- 
a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/filter/IsolationDiscoveryFilter.java
+++ 
b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/filter/IsolationDiscoveryFilter.java
@@ -147,6 +147,7 @@ public class IsolationDiscoveryFilter implements 
DiscoveryFilter {
         return ServiceCombServerStats.applyForTryingChance(invocation);
       }
       if (!serverStats.isIsolated()) {
+        // checkThresholdAllowed is not concurrent control, may print several 
logs/events in current access.
         serverStats.markIsolated(true);
         eventBus.post(
             new IsolationServerEvent(invocation, instance, serverStats,
@@ -159,7 +160,7 @@ public class IsolationDiscoveryFilter implements 
DiscoveryFilter {
     if (serverStats.isIsolated()) {
       // [2] so that we add a feature to isolate for at least a minimal time, 
and we can avoid
       // high volume of concurrent requests with a percentage of error(e.g. 
50%) scenario with no isolation
-      if ((System.currentTimeMillis() - serverStats.getLastVisitTime()) <= 
settings.minIsolationTime) {
+      if ((System.currentTimeMillis() - serverStats.getIsolatedTime()) <= 
settings.minIsolationTime) {
         return false;
       }
       serverStats.markIsolated(false);
@@ -178,7 +179,7 @@ public class IsolationDiscoveryFilter implements 
DiscoveryFilter {
 
     if (settings.continuousFailureThreshold > 0) {
       // continuousFailureThreshold has higher priority to decide the result
-      if (serverStats.getCountinuousFailureCount() >= 
settings.continuousFailureThreshold) {
+      if (serverStats.getContinuousFailureCount() >= 
settings.continuousFailureThreshold) {
         return false;
       }
     }
diff --git 
a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/filter/ServerDiscoveryFilter.java
 
b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/filter/ServerDiscoveryFilter.java
index 4bbdc2c..9e6b22e 100644
--- 
a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/filter/ServerDiscoveryFilter.java
+++ 
b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/filter/ServerDiscoveryFilter.java
@@ -17,12 +17,14 @@
 
 package org.apache.servicecomb.loadbalance.filter;
 
+import org.apache.servicecomb.core.Invocation;
 import org.apache.servicecomb.core.SCBEngine;
 import org.apache.servicecomb.core.Transport;
 import org.apache.servicecomb.core.registry.discovery.EndpointDiscoveryFilter;
 import org.apache.servicecomb.loadbalance.ServiceCombServer;
 import org.apache.servicecomb.registry.api.registry.MicroserviceInstance;
 import org.apache.servicecomb.registry.cache.CacheEndpoint;
+import org.apache.servicecomb.registry.discovery.DiscoveryContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -30,13 +32,14 @@ public class ServerDiscoveryFilter extends 
EndpointDiscoveryFilter {
   private static final Logger LOGGER = 
LoggerFactory.getLogger(ServerDiscoveryFilter.class);
 
   @Override
-  protected Object createEndpoint(String transportName, String endpoint, 
MicroserviceInstance instance) {
+  protected Object createEndpoint(DiscoveryContext context, String 
transportName, String endpoint,
+      MicroserviceInstance instance) {
     Transport transport = 
SCBEngine.getInstance().getTransportManager().findTransport(transportName);
     if (transport == null) {
       LOGGER.info("not deployed transport {}, ignore {}.", transportName, 
endpoint);
       return null;
     }
-
-    return new ServiceCombServer(transport, new CacheEndpoint(endpoint, 
instance));
+    Invocation invocation = context.getInputParameters();
+    return new ServiceCombServer(invocation.getMicroserviceName(), transport, 
new CacheEndpoint(endpoint, instance));
   }
 }
diff --git 
a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadBalanceCreator.java
 
b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadBalanceCreator.java
index 14f219c..dc0489e 100644
--- 
a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadBalanceCreator.java
+++ 
b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadBalanceCreator.java
@@ -44,12 +44,12 @@ public class TestLoadBalanceCreator {
     Endpoint host1 = new Endpoint(transport, "host1");
     MicroserviceInstance instance1 = new MicroserviceInstance();
     instance1.setInstanceId("instance1");
-    ServiceCombServer server = new ServiceCombServer(host1, instance1);
+    ServiceCombServer server = new ServiceCombServer(null, host1, instance1);
 
     Endpoint host2 = new Endpoint(transport, "host2");
     MicroserviceInstance instance2 = new MicroserviceInstance();
     instance2.setInstanceId("instance2");
-    ServiceCombServer server2 = new ServiceCombServer(host2, instance2);
+    ServiceCombServer server2 = new ServiceCombServer(null, host2, instance2);
 
     servers.add(server);
     servers.add(server2);
@@ -98,12 +98,12 @@ public class TestLoadBalanceCreator {
     Endpoint host1 = new Endpoint(transport, "host1");
     MicroserviceInstance instance1 = new MicroserviceInstance();
     instance1.setInstanceId("instance1");
-    ServiceCombServer server = new ServiceCombServer(host1, instance1);
+    ServiceCombServer server = new ServiceCombServer(null, host1, instance1);
 
     Endpoint host2 = new Endpoint(transport, "host2");
     MicroserviceInstance instance2 = new MicroserviceInstance();
     instance2.setInstanceId("instance2");
-    ServiceCombServer server2 = new ServiceCombServer(host2, instance2);
+    ServiceCombServer server2 = new ServiceCombServer(null, host2, instance2);
 
     servers.add(server);
     servers.add(server2);
@@ -150,8 +150,8 @@ public class TestLoadBalanceCreator {
     instance1.setInstanceId("ii01");
     MicroserviceInstance instance2 = new MicroserviceInstance();
     instance2.setInstanceId("ii02");
-    ServiceCombServer server = new ServiceCombServer(endpoint1, instance1);
-    ServiceCombServer server2 = new ServiceCombServer(endpoint2, instance2);
+    ServiceCombServer server = new ServiceCombServer(null, endpoint1, 
instance1);
+    ServiceCombServer server2 = new ServiceCombServer(null, endpoint2, 
instance2);
 
     new Expectations() {
       {
@@ -203,12 +203,12 @@ public class TestLoadBalanceCreator {
     List<ServiceCombServer> servers = new ArrayList<>();
     Endpoint host1 = new Endpoint(transport, "host1");
     MicroserviceInstance instance1 = new MicroserviceInstance();
-    ServiceCombServer server = new ServiceCombServer(host1, instance1);
+    ServiceCombServer server = new ServiceCombServer(null, host1, instance1);
     instance1.setInstanceId("instance1");
 
     Endpoint host2 = new Endpoint(transport, "host2");
     MicroserviceInstance instance2 = new MicroserviceInstance();
-    ServiceCombServer server2 = new ServiceCombServer(host2, instance2);
+    ServiceCombServer server2 = new ServiceCombServer(null, host2, instance2);
     instance2.setInstanceId("instance2");
 
     servers.add(server);
diff --git 
a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadBalanceHandler2.java
 
b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadBalanceHandler2.java
index 13e57ba..7d0938a 100644
--- 
a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadBalanceHandler2.java
+++ 
b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadBalanceHandler2.java
@@ -861,7 +861,7 @@ public class TestLoadBalanceHandler2 {
         (inv, aysnc) -> {
           Assert.assertEquals("rest://127.0.0.1:8080", 
inv.getEndpoint().getEndpoint());
           Assert.assertTrue(serviceCombServerStats.isIsolated());
-          Assert.assertEquals(5, 
serviceCombServerStats.getCountinuousFailureCount());
+          Assert.assertEquals(5, 
serviceCombServerStats.getContinuousFailureCount());
           Assert.assertFalse(ServiceCombServerStats.isolatedServerCanTry());
           aysnc.success("OK");
         });
@@ -875,7 +875,7 @@ public class TestLoadBalanceHandler2 {
     }
     Assert.assertEquals("rest://127.0.0.1:8080", 
invocation.getEndpoint().getEndpoint());
     Assert.assertTrue(serviceCombServerStats.isIsolated());
-    Assert.assertEquals(0, 
serviceCombServerStats.getCountinuousFailureCount());
+    Assert.assertEquals(0, serviceCombServerStats.getContinuousFailureCount());
     Assert.assertTrue(ServiceCombServerStats.isolatedServerCanTry());
   }
 
@@ -906,16 +906,16 @@ public class TestLoadBalanceHandler2 {
         (inv, aysnc) -> {
           Assert.assertFalse(stats0.isIsolated());
           Assert.assertTrue(stats1.isIsolated());
-          Assert.assertEquals(5, stats1.getCountinuousFailureCount());
+          Assert.assertEquals(5, stats1.getContinuousFailureCount());
           Assert.assertFalse(ServiceCombServerStats.isolatedServerCanTry());
           if (counter.value == 0) {
             Assert.assertEquals("rest://127.0.0.1:8080", 
inv.getEndpoint().getEndpoint());
-            Assert.assertEquals(0, stats0.getCountinuousFailureCount());
+            Assert.assertEquals(0, stats0.getContinuousFailureCount());
             counter.value++;
             aysnc.producerFail(new InvocationException(503, "RETRY", "retry to 
next instance"));
           } else if (counter.value == 1) {
             Assert.assertEquals("rest://127.0.0.1:8081", 
inv.getEndpoint().getEndpoint());
-            Assert.assertEquals(1, stats0.getCountinuousFailureCount());
+            Assert.assertEquals(1, stats0.getContinuousFailureCount());
             counter.value++;
             aysnc.success("OK");
           } else {
@@ -932,9 +932,9 @@ public class TestLoadBalanceHandler2 {
     }
     Assert.assertEquals("rest://127.0.0.1:8081", 
invocation.getEndpoint().getEndpoint());
     Assert.assertFalse(stats0.isIsolated());
-    Assert.assertEquals(1, stats0.getCountinuousFailureCount());
+    Assert.assertEquals(1, stats0.getContinuousFailureCount());
     Assert.assertTrue(stats1.isIsolated());
-    Assert.assertEquals(0, stats1.getCountinuousFailureCount());
+    Assert.assertEquals(0, stats1.getContinuousFailureCount());
     Assert.assertTrue(ServiceCombServerStats.isolatedServerCanTry());
   }
 
@@ -959,7 +959,7 @@ public class TestLoadBalanceHandler2 {
   private ServiceCombServer createMockedServer(String microserviceInstanceId, 
String endpoint) {
     MicroserviceInstance microserviceInstance = new MicroserviceInstance();
     microserviceInstance.setInstanceId(microserviceInstanceId);
-    return new ServiceCombServer(
+    return new ServiceCombServer(null,
         new Endpoint(Mockito.mock(Transport.class), endpoint),
         microserviceInstance);
   }
diff --git 
a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadbalanceHandler.java
 
b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadbalanceHandler.java
index b1348d3..754c6dd 100644
--- 
a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadbalanceHandler.java
+++ 
b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadbalanceHandler.java
@@ -163,7 +163,7 @@ public class TestLoadbalanceHandler {
     MicroserviceInstance instance1 = new MicroserviceInstance();
     instance1.setInstanceId("1234");
     CacheEndpoint cacheEndpoint = new CacheEndpoint("rest://localhost:8080", 
instance1);
-    ServiceCombServer server = new ServiceCombServer(restTransport, 
cacheEndpoint);
+    ServiceCombServer server = new ServiceCombServer(null, restTransport, 
cacheEndpoint);
     LoadBalancerStats stats = new LoadBalancerStats("test");
     new Expectations(loadBalancer) {
       {
@@ -192,7 +192,7 @@ public class TestLoadbalanceHandler {
     MicroserviceInstance instance1 = new MicroserviceInstance();
     instance1.setInstanceId("1234");
     CacheEndpoint cacheEndpoint = new CacheEndpoint("rest://localhost:8080", 
instance1);
-    ServiceCombServer server = new ServiceCombServer(restTransport, 
cacheEndpoint);
+    ServiceCombServer server = new ServiceCombServer(null, restTransport, 
cacheEndpoint);
     LoadBalancerStats stats = new LoadBalancerStats("test");
     new Expectations(loadBalancer) {
       {
@@ -221,7 +221,7 @@ public class TestLoadbalanceHandler {
     MicroserviceInstance instance1 = new MicroserviceInstance();
     instance1.setInstanceId("1234");
     CacheEndpoint cacheEndpoint = new CacheEndpoint("rest://localhost:8080", 
instance1);
-    ServiceCombServer server = new ServiceCombServer(restTransport, 
cacheEndpoint);
+    ServiceCombServer server = new ServiceCombServer(null, restTransport, 
cacheEndpoint);
     LoadBalancerStats stats = new LoadBalancerStats("test");
     new Expectations(loadBalancer) {
       {
diff --git 
a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestServiceCombLoadBalancerStats.java
 
b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestServiceCombLoadBalancerStats.java
index 1268d18..c539d41 100644
--- 
a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestServiceCombLoadBalancerStats.java
+++ 
b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestServiceCombLoadBalancerStats.java
@@ -77,7 +77,7 @@ public class TestServiceCombLoadBalancerStats {
     serviceCombLoadBalancerStats.setTimerIntervalInMillis(500);
     serviceCombLoadBalancerStats.init();
 
-    ServiceCombServer serviceCombServer = new ServiceCombServer(transport,
+    ServiceCombServer serviceCombServer = new ServiceCombServer(null, 
transport,
         new CacheEndpoint("rest://localhost:8080", instance));
     serviceCombLoadBalancerStats.markSuccess(serviceCombServer);
     ServiceCombServerStats stats = 
serviceCombLoadBalancerStats.getServiceCombServerStats(serviceCombServer);
@@ -94,16 +94,16 @@ public class TestServiceCombLoadBalancerStats {
     long time = System.currentTimeMillis();
     MicroserviceInstance instance = new MicroserviceInstance();
     instance.setInstanceId("instance1");
-    ServiceCombServer serviceCombServer = new ServiceCombServer(transport,
+    ServiceCombServer serviceCombServer = new ServiceCombServer(null, 
transport,
         new CacheEndpoint("rest://localhost:8080", instance));
     ServiceCombLoadBalancerStats.INSTANCE.markFailure(serviceCombServer);
     ServiceCombLoadBalancerStats.INSTANCE.markFailure(serviceCombServer);
     Assert.assertEquals(
-        
ServiceCombLoadBalancerStats.INSTANCE.getServiceCombServerStats(serviceCombServer).getCountinuousFailureCount(),
+        
ServiceCombLoadBalancerStats.INSTANCE.getServiceCombServerStats(serviceCombServer).getContinuousFailureCount(),
         2);
     ServiceCombLoadBalancerStats.INSTANCE.markSuccess(serviceCombServer);
     Assert.assertEquals(
-        
ServiceCombLoadBalancerStats.INSTANCE.getServiceCombServerStats(serviceCombServer).getCountinuousFailureCount(),
+        
ServiceCombLoadBalancerStats.INSTANCE.getServiceCombServerStats(serviceCombServer).getContinuousFailureCount(),
         0);
     ServiceCombLoadBalancerStats.INSTANCE.markSuccess(serviceCombServer);
     Assert
@@ -125,7 +125,7 @@ public class TestServiceCombLoadBalancerStats {
     long time = System.currentTimeMillis();
     MicroserviceInstance instance = new MicroserviceInstance();
     instance.setInstanceId("instance2");
-    ServiceCombServer serviceCombServer = new ServiceCombServer(transport,
+    ServiceCombServer serviceCombServer = new ServiceCombServer(null, 
transport,
         new CacheEndpoint("rest://localhost:8080", instance));
 
     CountDownLatch latch = new CountDownLatch(10);
diff --git 
a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestServiceCombServer.java
 
b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestServiceCombServer.java
index 8e4ce0a..13acd19 100644
--- 
a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestServiceCombServer.java
+++ 
b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestServiceCombServer.java
@@ -41,7 +41,7 @@ public class TestServiceCombServer {
   public void setUp() {
     MicroserviceInstance instance = new MicroserviceInstance();
     instance.setInstanceId("123456");
-    cs = new ServiceCombServer(transport, new CacheEndpoint("abcd", instance));
+    cs = new ServiceCombServer(null, transport, new CacheEndpoint("abcd", 
instance));
   }
 
   @Test
@@ -61,12 +61,12 @@ public class TestServiceCombServer {
 
     MicroserviceInstance instance1 = new MicroserviceInstance();
     instance1.setInstanceId("1234");
-    ServiceCombServer other = new ServiceCombServer(transport, new 
CacheEndpoint("1234", instance1));
+    ServiceCombServer other = new ServiceCombServer(null, transport, new 
CacheEndpoint("1234", instance1));
     Assert.assertFalse(cs.equals(other));
 
     MicroserviceInstance instance2 = new MicroserviceInstance();
     instance2.setInstanceId("123456");
-    other = new ServiceCombServer(transport, new CacheEndpoint("abcd", 
instance2));
+    other = new ServiceCombServer(null, transport, new CacheEndpoint("abcd", 
instance2));
     Assert.assertTrue(cs.equals(other));
   }
 
diff --git 
a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestServiceCombServerStats.java
 
b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestServiceCombServerStats.java
index 2ea105a..a7aad86 100644
--- 
a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestServiceCombServerStats.java
+++ 
b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestServiceCombServerStats.java
@@ -43,12 +43,12 @@ public class TestServiceCombServerStats {
   @Test
   public void testSimpleThread() {
     long time = System.currentTimeMillis();
-    ServiceCombServerStats stats = new ServiceCombServerStats();
+    ServiceCombServerStats stats = new ServiceCombServerStats(null);
     stats.markFailure();
     stats.markFailure();
-    Assert.assertEquals(2, stats.getCountinuousFailureCount());
+    Assert.assertEquals(2, stats.getContinuousFailureCount());
     stats.markSuccess();
-    Assert.assertEquals(0, stats.getCountinuousFailureCount());
+    Assert.assertEquals(0, stats.getContinuousFailureCount());
     stats.markSuccess();
     Assert.assertEquals(4, stats.getTotalRequests());
     Assert.assertEquals(50, stats.getFailedRate());
@@ -60,7 +60,7 @@ public class TestServiceCombServerStats {
   @Test
   public void testMiltiThread() throws Exception {
     long time = System.currentTimeMillis();
-    ServiceCombServerStats stats = new ServiceCombServerStats();
+    ServiceCombServerStats stats = new ServiceCombServerStats(null);
     CountDownLatch latch = new CountDownLatch(10);
     for (int i = 0; i < 10; i++) {
       new Thread(() -> {
@@ -81,7 +81,7 @@ public class TestServiceCombServerStats {
 
   @Test
   public void testTimeWindow() {
-    ServiceCombServerStats stats = new ServiceCombServerStats(new 
MockClock(new Holder<>(1000L)));
+    ServiceCombServerStats stats = new ServiceCombServerStats(null, new 
MockClock(new Holder<>(1000L)));
     Assert.assertEquals(1000, stats.getLastVisitTime());
     stats.markSuccess();
     stats.markFailure();
diff --git 
a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestSessionSticknessRule.java
 
b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestSessionSticknessRule.java
index 2aefc3c..ad392b6 100644
--- 
a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestSessionSticknessRule.java
+++ 
b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestSessionSticknessRule.java
@@ -50,7 +50,7 @@ public class TestSessionSticknessRule {
     MicroserviceInstance instance1 = new MicroserviceInstance();
     instance1.setInstanceId("1234");
     ServiceCombServer mockedServer =
-        new ServiceCombServer(transport, new 
CacheEndpoint("rest:127.0.0.1:8889", instance1));
+        new ServiceCombServer(null, transport, new 
CacheEndpoint("rest:127.0.0.1:8889", instance1));
     Invocation invocation = mock(Invocation.class);
     LoadBalancerStats stats = mock(LoadBalancerStats.class);
     Mockito.when(mockedLb.getLoadBalancerStats()).thenReturn(stats);
@@ -242,7 +242,7 @@ public class TestSessionSticknessRule {
     MicroserviceInstance instance1 = new MicroserviceInstance();
     instance1.setInstanceId("1234");
     ServiceCombServer mockedServer =
-        new ServiceCombServer(transport, new 
CacheEndpoint("rest:127.0.0.1:8890", instance1));
+        new ServiceCombServer(null, transport, new 
CacheEndpoint("rest:127.0.0.1:8890", instance1));
     mockedServer.setAlive(true);
     mockedServer.setReadyToServe(true);
     mockedServer.setId("mockedServer");
@@ -250,7 +250,7 @@ public class TestSessionSticknessRule {
     LoadBalancer lb = new LoadBalancer(rule, "mockedServer");
     
when(invocation.getLocalContext(LoadbalanceHandler.CONTEXT_KEY_SERVER_LIST)).thenReturn(allServers);
     rule.setLoadBalancer(lb);
-    ServiceCombServer server = new ServiceCombServer(transport, new 
CacheEndpoint("rest:127.0.0.1:8890", instance1));
+    ServiceCombServer server = new ServiceCombServer(null, transport, new 
CacheEndpoint("rest:127.0.0.1:8890", instance1));
     Deencapsulation.setField(rule, "lastServer", server);
 
     new MockUp<SessionStickinessRule>(rule) {
diff --git 
a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/filter/IsolationDiscoveryFilterTest.java
 
b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/filter/IsolationDiscoveryFilterTest.java
index 1728161..f2ad8c6 100644
--- 
a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/filter/IsolationDiscoveryFilterTest.java
+++ 
b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/filter/IsolationDiscoveryFilterTest.java
@@ -75,7 +75,8 @@ public class IsolationDiscoveryFilterTest {
       String endpoint = "rest://127.0.0.1:" + i;
       instance.setEndpoints(Collections.singletonList(endpoint));
       data.put(instance.getInstanceId(), instance);
-      ServiceCombServer serviceCombServer = new ServiceCombServer(transport, 
new CacheEndpoint(endpoint, instance));
+      ServiceCombServer serviceCombServer = new 
ServiceCombServer(invocation.getMicroserviceName(), transport,
+          new CacheEndpoint(endpoint, instance));
       
ServiceCombLoadBalancerStats.INSTANCE.getServiceCombServerStats(serviceCombServer);
     }
     discoveryTreeNode.data(data);
@@ -214,7 +215,7 @@ public class IsolationDiscoveryFilterTest {
 
     ServiceCombServerStats serviceCombServerStats = 
ServiceCombLoadBalancerStats.INSTANCE
         .getServiceCombServerStats(server0);
-    Deencapsulation.setField(serviceCombServerStats, "lastVisitTime",
+    Deencapsulation.setField(serviceCombServerStats, "isolatedTime",
         System.currentTimeMillis() - 
Configuration.INSTANCE.getMinIsolationTime(invocation.getMicroserviceName()) - 
1);
     childNode = filter.discovery(discoveryContext, discoveryTreeNode);
     childNodeData = childNode.data();
@@ -230,10 +231,11 @@ public class IsolationDiscoveryFilterTest {
     ServiceCombLoadBalancerStats.INSTANCE.markSuccess(server0);
     ServiceCombServerStats serviceCombServerStats = 
ServiceCombLoadBalancerStats.INSTANCE
         .getServiceCombServerStats(server0);
-    Deencapsulation.setField(serviceCombServerStats, "lastVisitTime",
-        System.currentTimeMillis() - 
Configuration.INSTANCE.getMinIsolationTime(invocation.getMicroserviceName()) - 
1);
 
     ServiceCombLoadBalancerStats.INSTANCE.markIsolated(server0, true);
+    Deencapsulation.setField(serviceCombServerStats, "isolatedTime",
+        System.currentTimeMillis() - 
Configuration.INSTANCE.getMinIsolationTime(invocation.getMicroserviceName()) - 
1);
+
     DiscoveryTreeNode childNode = filter.discovery(discoveryContext, 
discoveryTreeNode);
     Map<String, MicroserviceInstance> childNodeData = childNode.data();
     Assert.assertThat(childNodeData.keySet(), 
Matchers.containsInAnyOrder("i0", "i1", "i2"));
diff --git 
a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/filter/TestServerDiscoveryFilter.java
 
b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/filter/TestServerDiscoveryFilter.java
index a5e16e0..e0370d0 100644
--- 
a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/filter/TestServerDiscoveryFilter.java
+++ 
b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/filter/TestServerDiscoveryFilter.java
@@ -19,6 +19,7 @@ package org.apache.servicecomb.loadbalance.filter;
 
 import org.apache.servicecomb.config.ConfigUtil;
 import org.apache.servicecomb.core.Const;
+import org.apache.servicecomb.core.Invocation;
 import org.apache.servicecomb.core.SCBEngine;
 import org.apache.servicecomb.core.Transport;
 import org.apache.servicecomb.core.bootstrap.SCBBootstrap;
@@ -26,12 +27,14 @@ import 
org.apache.servicecomb.core.transport.TransportManager;
 import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
 import org.apache.servicecomb.loadbalance.ServiceCombServer;
 import org.apache.servicecomb.registry.api.registry.MicroserviceInstance;
+import org.apache.servicecomb.registry.discovery.DiscoveryContext;
 import org.junit.AfterClass;
 import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
 import mockit.Expectations;
+import mockit.Injectable;
 import mockit.Mocked;
 
 public class TestServerDiscoveryFilter {
@@ -66,23 +69,27 @@ public class TestServerDiscoveryFilter {
       }
     };
 
-    ServiceCombServer server = (ServiceCombServer) 
filter.createEndpoint(Const.RESTFUL, null, null);
+    ServiceCombServer server = (ServiceCombServer) filter.createEndpoint(null, 
Const.RESTFUL, null, null);
     Assert.assertNull(server);
   }
 
   @Test
-  public void createEndpointNormal() {
+  public void createEndpointNormal(@Injectable DiscoveryContext context, 
@Injectable Invocation invocation) {
     new Expectations(transportManager) {
       {
         transportManager.findTransport(anyString);
         result = trasport;
+        context.getInputParameters();
+        result = invocation;
+        invocation.getMicroserviceName();
+        result = "test";
       }
     };
     MicroserviceInstance instance = new MicroserviceInstance();
     instance.setInstanceId("0000001");
 
     ServiceCombServer server = (ServiceCombServer) filter
-        .createEndpoint(Const.RESTFUL, "rest://localhost:8080", instance);
+        .createEndpoint(context, Const.RESTFUL, "rest://localhost:8080", 
instance);
     Assert.assertSame(instance, server.getInstance());
     Assert.assertSame(trasport, server.getEndpoint().getTransport());
     Assert.assertEquals("rest://localhost:8080", 
server.getEndpoint().getEndpoint());

Reply via email to