You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by li...@apache.org on 2018/08/14 08:51:58 UTC

[incubator-servicecomb-java-chassis] branch master updated (7aa41f4 -> 566e709)

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

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


    from 7aa41f4  [SCB-827] change DefaultHttpClientFilter to return response instead of throwing exception
     new af77fd1  [SCB-802]in rollback scenario, old versions meta is used and invocation is fail
     new 5f813c9  [SCB-802]minor fix, add a log to better analyze no server problem
     new 566e709  [SCB-802]change implementation, only reset lastest version

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../servicecomb/loadbalance/LoadBalancerCreator.java      | 10 ++++++++++
 .../serviceregistry/consumer/MicroserviceVersionRule.java | 15 +++++++++++++--
 .../consumer/TestMicroserviceVersionRule.java             | 10 +++++++++-
 3 files changed, 32 insertions(+), 3 deletions(-)


[incubator-servicecomb-java-chassis] 01/03: [SCB-802]in rollback scenario, old versions meta is used and invocation is fail

Posted by li...@apache.org.
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

commit af77fd16a0d04c8d3c077b8bd2e8f76f7d822620
Author: liubao <ba...@huawei.com>
AuthorDate: Fri Aug 3 18:10:09 2018 +0800

    [SCB-802]in rollback scenario, old versions meta is used and invocation is fail
---
 .../consumer/MicroserviceVersions.java             | 23 ++++++++++++++++
 .../consumer/TestMicroserviceVersions.java         | 31 ++++++++++++++++++++++
 2 files changed, 54 insertions(+)

diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersions.java b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersions.java
index ab4f479..ad4b721 100644
--- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersions.java
+++ b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersions.java
@@ -18,8 +18,10 @@
 package org.apache.servicecomb.serviceregistry.consumer;
 
 import java.util.Comparator;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
 
@@ -191,9 +193,30 @@ public class MicroserviceVersions {
         microserviceVersionRule.setInstances(instances);
       }
       revision = rev;
+      // Clean up down versions in case of rollback and other interface not compatible scenarios. Users should ensure running versions are compatible.
+      pack();
     }
   }
 
+  private void pack() {
+    Set<String> microservices = new HashSet<>(instances.size());
+    instances.forEach(item -> {
+      microservices.add(item.getServiceId());
+    });
+    Set<String> downSet = new HashSet<>(instances.size());
+    versions.keySet().forEach(item -> {
+      if (!microservices.contains(item)) {
+        downSet.add(item);
+      }
+    });
+    downSet.forEach(item -> {
+      MicroserviceVersion version = versions.remove(item);
+      for (MicroserviceVersionRule microserviceVersionRule : versionRules.values()) {
+        microserviceVersionRule.deleteMicroserviceVersion(version);
+      }
+    });
+  }
+
   private List<MicroserviceInstance> mergeInstances(List<MicroserviceInstance> pulledInstances,
       List<MicroserviceInstance> inUseInstances) {
     List<MicroserviceInstance> upInstances = pulledInstances
diff --git a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/consumer/TestMicroserviceVersions.java b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/consumer/TestMicroserviceVersions.java
index 9614048..e4e48e5 100644
--- a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/consumer/TestMicroserviceVersions.java
+++ b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/consumer/TestMicroserviceVersions.java
@@ -25,6 +25,7 @@ import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
 import org.apache.servicecomb.serviceregistry.RegistryUtils;
+import org.apache.servicecomb.serviceregistry.ServiceRegistry;
 import org.apache.servicecomb.serviceregistry.api.Const;
 import org.apache.servicecomb.serviceregistry.api.MicroserviceKey;
 import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
@@ -46,6 +47,7 @@ import com.google.common.eventbus.Subscribe;
 
 import mockit.Deencapsulation;
 import mockit.Expectations;
+import mockit.Injectable;
 import mockit.Mock;
 import mockit.MockUp;
 import mockit.Mocked;
@@ -385,4 +387,33 @@ public class TestMicroserviceVersions {
         new MicroserviceVersions(appManager, appId, "false" + appId + Const.APP_SERVICE_SEPARATOR + microserviceName);
     checkIsEventAccept(key, false);
   }
+
+  @Test
+  public void testPack(@Injectable MicroserviceInstance instance, @Injectable Microservice microservice) {
+    ServiceRegistry serviceRegistry = new MockUp<ServiceRegistry>() {
+      @Mock
+      Microservice getRemoteMicroservice(String microserviceId) {
+        return microservice;
+      }
+    }.getMockInstance();
+    RegistryUtils.setServiceRegistry(serviceRegistry);
+
+    new Expectations() {
+      {
+        instance.getStatus();
+        result = MicroserviceInstanceStatus.UP;
+        instance.getServiceId();
+        result = microserviceName;
+        microservice.getVersion();
+        result = "0.3.0";
+      }
+    };
+    List<MicroserviceInstance> instances = new ArrayList<>();
+    instances.add(instance);
+    MicroserviceVersions testVersions = new MicroserviceVersions(appManager, appId, microserviceName);
+    testVersions.safeSetInstances(instances, "100");
+    Assert.assertEquals(testVersions.getVersions().size(), 1);
+    testVersions.safeSetInstances(new ArrayList<>(), "120");
+    Assert.assertEquals(testVersions.getVersions().size(), 0);
+  }
 }


[incubator-servicecomb-java-chassis] 02/03: [SCB-802]minor fix, add a log to better analyze no server problem

Posted by li...@apache.org.
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

commit 5f813c998af5286096aadf1d2f1c89f1a7158d7e
Author: liubao <ba...@huawei.com>
AuthorDate: Wed Aug 8 10:35:19 2018 +0800

    [SCB-802]minor fix, add a log to better analyze no server problem
---
 .../apache/servicecomb/loadbalance/LoadBalancerCreator.java    | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/LoadBalancerCreator.java b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/LoadBalancerCreator.java
index 78baad4..eedbb9c 100644
--- a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/LoadBalancerCreator.java
+++ b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/LoadBalancerCreator.java
@@ -22,6 +22,8 @@ import java.util.List;
 
 import org.apache.servicecomb.core.Invocation;
 import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.netflix.loadbalancer.IRule;
@@ -43,6 +45,8 @@ import com.netflix.loadbalancer.WeightedResponseTimeRule;
  *  on the result of ServerListFilter, they should not contain operation level state information in instance fields.
  */
 public class LoadBalancerCreator {
+  private static final Logger LOGGER = LoggerFactory.getLogger(LoadBalancerCreator.class);
+
   private List<Server> serverList = Collections.emptyList();
 
   private IRule rule;
@@ -72,6 +76,9 @@ public class LoadBalancerCreator {
   // serverList almost not changed for different invocation
   // so every invocation will call setServerList, this is no problem
   public void setServerList(List<Server> serverList) {
+    if (serverList.isEmpty()) {
+      LOGGER.warn("Set empty server list.");
+    }
     this.serverList = Collections.unmodifiableList(serverList);
   }
 
@@ -86,6 +93,9 @@ public class LoadBalancerCreator {
     for (ServerListFilterExt filter : this.filters) {
       filter.setLoadBalancer(loadBalancer);
       servers = filter.getFilteredListOfServers(servers, invocation);
+      if (servers.isEmpty()) {
+        LOGGER.warn("Filter {} get empty list.", filter.getClass().getName());
+      }
     }
     loadBalancer.setServerList(servers);
     return loadBalancer;


[incubator-servicecomb-java-chassis] 03/03: [SCB-802]change implementation, only reset lastest version

Posted by li...@apache.org.
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

commit 566e709f782a5007aa501fb364bb93410ae44d5d
Author: liubao <ba...@huawei.com>
AuthorDate: Tue Aug 14 16:24:16 2018 +0800

    [SCB-802]change implementation, only reset lastest version
---
 .../consumer/MicroserviceVersionRule.java          | 15 +++++++++--
 .../consumer/MicroserviceVersions.java             | 23 ----------------
 .../consumer/TestMicroserviceVersionRule.java      | 10 ++++++-
 .../consumer/TestMicroserviceVersions.java         | 31 ----------------------
 4 files changed, 22 insertions(+), 57 deletions(-)

diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersionRule.java b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersionRule.java
index 22060ae..cff2fae 100644
--- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersionRule.java
+++ b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersionRule.java
@@ -20,6 +20,7 @@ package org.apache.servicecomb.serviceregistry.consumer;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
+import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.function.Function;
@@ -111,9 +112,18 @@ public class MicroserviceVersionRule {
   }
 
   protected void resetLatestVersion() {
+    Map<String, MicroserviceVersion> tempVersions = new HashMap<>();
+    instances.values().forEach(item -> {
+      MicroserviceVersion version = versions.get(item.getServiceId());
+      if (version != null) {
+        tempVersions.put(item.getServiceId(), version);
+      }
+    });
+
     MicroserviceVersion lastLatestVersion = latestVersion;
-    latestVersion = null;
-    if (!versions.isEmpty()) {
+    if (!tempVersions.isEmpty()) {
+      latestVersion = tempVersions.values().stream().max(Comparator.comparing(MicroserviceVersion::getVersion)).get();
+    } else if (!versions.isEmpty()) {
       latestVersion = versions.values().stream().max(Comparator.comparing(MicroserviceVersion::getVersion)).get();
     }
 
@@ -172,5 +182,6 @@ public class MicroserviceVersionRule {
     instances = Collections.unmodifiableMap(tmpInstances);
 
     resetInstanceCache();
+    resetLatestVersion();
   }
 }
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersions.java b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersions.java
index ad4b721..ab4f479 100644
--- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersions.java
+++ b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersions.java
@@ -18,10 +18,8 @@
 package org.apache.servicecomb.serviceregistry.consumer;
 
 import java.util.Comparator;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
 
@@ -193,30 +191,9 @@ public class MicroserviceVersions {
         microserviceVersionRule.setInstances(instances);
       }
       revision = rev;
-      // Clean up down versions in case of rollback and other interface not compatible scenarios. Users should ensure running versions are compatible.
-      pack();
     }
   }
 
-  private void pack() {
-    Set<String> microservices = new HashSet<>(instances.size());
-    instances.forEach(item -> {
-      microservices.add(item.getServiceId());
-    });
-    Set<String> downSet = new HashSet<>(instances.size());
-    versions.keySet().forEach(item -> {
-      if (!microservices.contains(item)) {
-        downSet.add(item);
-      }
-    });
-    downSet.forEach(item -> {
-      MicroserviceVersion version = versions.remove(item);
-      for (MicroserviceVersionRule microserviceVersionRule : versionRules.values()) {
-        microserviceVersionRule.deleteMicroserviceVersion(version);
-      }
-    });
-  }
-
   private List<MicroserviceInstance> mergeInstances(List<MicroserviceInstance> pulledInstances,
       List<MicroserviceInstance> inUseInstances) {
     List<MicroserviceInstance> upInstances = pulledInstances
diff --git a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/consumer/TestMicroserviceVersionRule.java b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/consumer/TestMicroserviceVersionRule.java
index 8ac62a5..659c8af 100644
--- a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/consumer/TestMicroserviceVersionRule.java
+++ b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/consumer/TestMicroserviceVersionRule.java
@@ -78,7 +78,8 @@ public class TestMicroserviceVersionRule {
     microserviceVersionRule.addMicroserviceVersion(v2);
 
     microserviceVersionRule.deleteMicroserviceVersion(v2);
-    Assert.assertNull(microserviceVersionRule.getLatestMicroserviceVersion());
+    // keep a latest version always, event no versions.
+    Assert.assertEquals(microserviceVersionRule.getLatestMicroserviceVersion(), v2);
   }
 
   @Test
@@ -110,5 +111,12 @@ public class TestMicroserviceVersionRule {
         microserviceVersionRule.getInstanceCache().getInstanceMap());
     Assert.assertSame(microserviceVersionRule.getInstances(),
         microserviceVersionRule.getVersionedCache().data());
+    Assert.assertEquals(microserviceVersionRule.getLatestMicroserviceVersion(), v2);
+    microserviceVersionRule.setInstances(Arrays.asList(instance2));
+    Assert.assertEquals(microserviceVersionRule.getLatestMicroserviceVersion(), v2);
+
+    MicroserviceVersion v3 = MicroserviceVersionTestUtils.createMicroserviceVersion("3", "3.0.0");
+    microserviceVersionRule.addMicroserviceVersion(v3);
+    Assert.assertEquals(microserviceVersionRule.getLatestMicroserviceVersion(), v2);
   }
 }
diff --git a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/consumer/TestMicroserviceVersions.java b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/consumer/TestMicroserviceVersions.java
index e4e48e5..9614048 100644
--- a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/consumer/TestMicroserviceVersions.java
+++ b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/consumer/TestMicroserviceVersions.java
@@ -25,7 +25,6 @@ import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
 import org.apache.servicecomb.serviceregistry.RegistryUtils;
-import org.apache.servicecomb.serviceregistry.ServiceRegistry;
 import org.apache.servicecomb.serviceregistry.api.Const;
 import org.apache.servicecomb.serviceregistry.api.MicroserviceKey;
 import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
@@ -47,7 +46,6 @@ import com.google.common.eventbus.Subscribe;
 
 import mockit.Deencapsulation;
 import mockit.Expectations;
-import mockit.Injectable;
 import mockit.Mock;
 import mockit.MockUp;
 import mockit.Mocked;
@@ -387,33 +385,4 @@ public class TestMicroserviceVersions {
         new MicroserviceVersions(appManager, appId, "false" + appId + Const.APP_SERVICE_SEPARATOR + microserviceName);
     checkIsEventAccept(key, false);
   }
-
-  @Test
-  public void testPack(@Injectable MicroserviceInstance instance, @Injectable Microservice microservice) {
-    ServiceRegistry serviceRegistry = new MockUp<ServiceRegistry>() {
-      @Mock
-      Microservice getRemoteMicroservice(String microserviceId) {
-        return microservice;
-      }
-    }.getMockInstance();
-    RegistryUtils.setServiceRegistry(serviceRegistry);
-
-    new Expectations() {
-      {
-        instance.getStatus();
-        result = MicroserviceInstanceStatus.UP;
-        instance.getServiceId();
-        result = microserviceName;
-        microservice.getVersion();
-        result = "0.3.0";
-      }
-    };
-    List<MicroserviceInstance> instances = new ArrayList<>();
-    instances.add(instance);
-    MicroserviceVersions testVersions = new MicroserviceVersions(appManager, appId, microserviceName);
-    testVersions.safeSetInstances(instances, "100");
-    Assert.assertEquals(testVersions.getVersions().size(), 1);
-    testVersions.safeSetInstances(new ArrayList<>(), "120");
-    Assert.assertEquals(testVersions.getVersions().size(), 0);
-  }
 }