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:59 UTC

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

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