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