You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by wu...@apache.org on 2019/04/20 18:08:16 UTC

[servicecomb-java-chassis] branch master updated: [SCB-1088] SDK IsolationServerEvent is missing endpoint information

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

wujimin 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 c957fc3  [SCB-1088] SDK IsolationServerEvent is missing endpoint information
c957fc3 is described below

commit c957fc3cce598c05665d5aedb858577f19978e4e
Author: heyile <25...@qq.com>
AuthorDate: Sat Apr 20 11:49:03 2019 +0800

    [SCB-1088] SDK IsolationServerEvent is missing endpoint information
---
 .../loadbalance/event/IsolationServerEvent.java    |   4 +-
 .../filter/IsolationDiscoveryFilter.java           |   9 +-
 .../loadbalance/TestLoadBalanceHandler2.java       | 101 +++++++++++++++++++++
 3 files changed, 106 insertions(+), 8 deletions(-)

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 3c1cb22..a48e6d4 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
@@ -52,10 +52,10 @@ public class IsolationServerEvent extends AlarmEvent {
 
   public IsolationServerEvent(Invocation invocation, MicroserviceInstance instance,
       ServiceCombServerStats serverStats,
-      IsolationDiscoveryFilter.Settings settings, Type type) {
+      IsolationDiscoveryFilter.Settings settings, Type type, Endpoint endpoint) {
     super(type);
     this.microserviceName = invocation.getMicroserviceName();
-    this.endpoint = invocation.getEndpoint();
+    this.endpoint = endpoint;
     this.currentTotalRequest = serverStats.getTotalRequests();
     this.currentCountinuousFailureCount = serverStats.getCountinuousFailureCount();
     this.currentErrorPercentage = serverStats.getFailedRate();
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 c1bb516..4328d73 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
@@ -152,7 +152,7 @@ public class IsolationDiscoveryFilter implements DiscoveryFilter {
         ServiceCombLoadBalancerStats.INSTANCE.markIsolated(server, true);
         eventBus.post(
             new IsolationServerEvent(invocation, instance, serverStats,
-                settings, Type.OPEN));
+                settings, Type.OPEN, server.getEndpoint()));
         LOGGER.warn("Isolate service {}'s instance {}.", invocation.getMicroserviceName(),
             instance.getInstanceId());
       }
@@ -166,7 +166,7 @@ public class IsolationDiscoveryFilter implements DiscoveryFilter {
       }
       ServiceCombLoadBalancerStats.INSTANCE.markIsolated(server, false);
       eventBus.post(new IsolationServerEvent(invocation, instance, serverStats,
-          settings, Type.CLOSE));
+          settings, Type.CLOSE, server.getEndpoint()));
       LOGGER.warn("Recover service {}'s instance {} from isolation.", invocation.getMicroserviceName(),
           instance.getInstanceId());
     }
@@ -188,9 +188,6 @@ public class IsolationDiscoveryFilter implements DiscoveryFilter {
     if (settings.errorThresholdPercentage == 0) {
       return true;
     }
-    if (serverStats.getFailedRate() >= settings.errorThresholdPercentage) {
-      return false;
-    }
-    return true;
+    return serverStats.getFailedRate() < settings.errorThresholdPercentage;
   }
 }
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 2c2c7db..f0e3ad5 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
@@ -20,11 +20,14 @@ package org.apache.servicecomb.loadbalance;
 import static org.mockito.Mockito.when;
 
 import java.util.ArrayList;
+import java.util.EventListener;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
 
+import javax.xml.ws.Holder;
+
 import org.apache.servicecomb.core.CseContext;
 import org.apache.servicecomb.core.Invocation;
 import org.apache.servicecomb.core.NonSwaggerInvocation;
@@ -35,7 +38,9 @@ import org.apache.servicecomb.core.definition.OperationMeta;
 import org.apache.servicecomb.core.definition.SchemaMeta;
 import org.apache.servicecomb.core.provider.consumer.ReferenceConfig;
 import org.apache.servicecomb.core.transport.TransportManager;
+import org.apache.servicecomb.foundation.common.event.EventManager;
 import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
+import org.apache.servicecomb.loadbalance.event.IsolationServerEvent;
 import org.apache.servicecomb.loadbalance.filter.IsolationDiscoveryFilter;
 import org.apache.servicecomb.loadbalance.filter.ServerDiscoveryFilter;
 import org.apache.servicecomb.loadbalance.filter.ZoneAwareDiscoveryFilter;
@@ -55,6 +60,8 @@ import org.junit.BeforeClass;
 import org.junit.Test;
 import org.mockito.Mockito;
 
+import com.google.common.eventbus.Subscribe;
+
 /**
  *
  *
@@ -216,6 +223,100 @@ public class TestLoadBalanceHandler2 {
   }
 
   @Test
+  public void testIsolationEventWithEndpoint() throws Exception {
+    ReferenceConfig referenceConfig = Mockito.mock(ReferenceConfig.class);
+    OperationMeta operationMeta = Mockito.mock(OperationMeta.class);
+    SchemaMeta schemaMeta = Mockito.mock(SchemaMeta.class);
+    when(operationMeta.getSchemaMeta()).thenReturn(schemaMeta);
+    MicroserviceMeta microserviceMeta = Mockito.mock(MicroserviceMeta.class);
+    when(schemaMeta.getMicroserviceMeta()).thenReturn(microserviceMeta);
+    when(schemaMeta.getMicroserviceName()).thenReturn("testMicroserviceName");
+    when(microserviceMeta.getAppId()).thenReturn("testApp");
+    when(referenceConfig.getVersionRule()).thenReturn("0.0.0+");
+    when(referenceConfig.getTransport()).thenReturn("rest");
+    Invocation invocation = new Invocation(referenceConfig, operationMeta, new Object[0]);
+
+    InstanceCacheManager instanceCacheManager = Mockito.mock(InstanceCacheManager.class);
+    ServiceRegistry serviceRegistry = Mockito.mock(ServiceRegistry.class);
+    TransportManager transportManager = Mockito.mock(TransportManager.class);
+    Transport transport = Mockito.mock(Transport.class);
+    ArchaiusUtils.setProperty("servicecomb.loadbalance.filter.operation.enabled", "false");
+
+    // set up data
+    MicroserviceInstance myself = new MicroserviceInstance();
+    DataCenterInfo info = new DataCenterInfo();
+    info.setName("test");
+    info.setRegion("test");
+    info.setAvailableZone("test");
+    myself.setDataCenterInfo(info);
+
+    MicroserviceInstance instance = new MicroserviceInstance();
+    info = new DataCenterInfo();
+    info.setName("test");
+    info.setRegion("test");
+    info.setAvailableZone("test");
+    List<String> allMatchEndpoint = new ArrayList<>();
+    allMatchEndpoint.add("rest://localhost:9090");
+    instance.setEndpoints(allMatchEndpoint);
+    instance.setDataCenterInfo(info);
+    instance.setInstanceId("instance");
+
+    Map<String, MicroserviceInstance> data = new HashMap<>();
+    DiscoveryTreeNode parent = new DiscoveryTreeNode().name("parent").data(data);
+    CseContext.getInstance().setTransportManager(transportManager);
+
+    RegistryUtils.setServiceRegistry(serviceRegistry);
+
+    when(serviceRegistry.getMicroserviceInstance()).thenReturn(myself);
+    when(serviceRegistry.getInstanceCacheManager()).thenReturn(instanceCacheManager);
+    when(instanceCacheManager.getOrCreateVersionedCache("testApp", "testMicroserviceName", "0.0.0+"))
+        .thenReturn(parent);
+    when(transportManager.findTransport("rest")).thenReturn(transport);
+
+    LoadbalanceHandler handler = null;
+    LoadBalancer loadBalancer = null;
+    ServiceCombServer server = null;
+
+    handler = new LoadbalanceHandler();
+    loadBalancer = handler.getOrCreateLoadBalancer(invocation);
+    server = loadBalancer.chooseServer(invocation);
+    Assert.assertNull(server);
+
+    data.put("instance", instance);
+    parent.cacheVersion(parent.cacheVersion() + 1);
+    loadBalancer = handler.getOrCreateLoadBalancer(invocation);
+    server = loadBalancer.chooseServer(invocation);
+    Assert.assertEquals("rest://localhost:9090", server.getEndpoint().getEndpoint());
+
+    ServiceCombLoadBalancerStats.INSTANCE.markSuccess(server);
+    ServiceCombLoadBalancerStats.INSTANCE.markSuccess(server);
+    ServiceCombLoadBalancerStats.INSTANCE.markSuccess(server);
+    ServiceCombLoadBalancerStats.INSTANCE.markSuccess(server);
+    ServiceCombLoadBalancerStats.INSTANCE.markFailure(server);
+
+    //if errorThresholdPercentage greater than 0, it will activate.
+    ArchaiusUtils.setProperty("servicecomb.loadbalance.isolation.errorThresholdPercentage", "10");
+    ArchaiusUtils.setProperty("servicecomb.loadbalance.isolation.minIsolationTime", "10");
+
+    Holder<Integer> count = new Holder<>(0);
+    EventListener isolationEndpointListener = new EventListener() {
+      @Subscribe
+      public void listener(IsolationServerEvent event) {
+        count.value++;
+        Assert.assertSame("Isolation Endpoint", "rest://localhost:9090", event.getEndpoint().getEndpoint());
+      }
+    };
+    EventManager.getEventBus().register(isolationEndpointListener);
+    Assert.assertEquals(0, count.value.intValue());
+    loadBalancer = handler.getOrCreateLoadBalancer(invocation);
+    server = loadBalancer.chooseServer(invocation);
+    // no server is available
+    Assert.assertNull(server);
+    Assert.assertEquals(1, count.value.intValue());
+    EventManager.unregister(isolationEndpointListener);
+  }
+
+  @Test
   public void testZoneAwareAndIsolationFilterWorksEmptyInstanceProtectionEnabled() throws Exception {
     ArchaiusUtils.setProperty("servicecomb.loadbalance.filter.isolation.emptyInstanceProtectionEnabled", "true");
     ReferenceConfig referenceConfig = Mockito.mock(ReferenceConfig.class);