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 <bao....@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); - } }