From 989922600c4094e6dd3e9da24edd01f7bddffbd4 Mon Sep 17 00:00:00 2001 From: KomachiSion Date: Fri, 26 Aug 2022 14:55:35 +0800 Subject: [PATCH] Remove EmptyServiceAutoCleaner.java --- .../persistent/ClusterVersionJudgement.java | 137 ----- .../nacos/naming/core/ServiceManager.java | 27 - .../v2/cleaner/EmptyServiceAutoCleaner.java | 103 ---- .../nacos/naming/misc/GlobalExecutor.java | 47 -- .../nacos/naming/core/DomainsManagerTest.java | 61 --- .../nacos/naming/core/ServiceManagerTest.java | 473 ------------------ .../cleaner/EmptyServiceAutoCleanerTest.java | 75 --- 7 files changed, 923 deletions(-) delete mode 100644 naming/src/main/java/com/alibaba/nacos/naming/consistency/persistent/ClusterVersionJudgement.java delete mode 100644 naming/src/main/java/com/alibaba/nacos/naming/core/v2/cleaner/EmptyServiceAutoCleaner.java delete mode 100644 naming/src/test/java/com/alibaba/nacos/naming/core/DomainsManagerTest.java delete mode 100644 naming/src/test/java/com/alibaba/nacos/naming/core/ServiceManagerTest.java delete mode 100644 naming/src/test/java/com/alibaba/nacos/naming/core/v2/cleaner/EmptyServiceAutoCleanerTest.java diff --git a/naming/src/main/java/com/alibaba/nacos/naming/consistency/persistent/ClusterVersionJudgement.java b/naming/src/main/java/com/alibaba/nacos/naming/consistency/persistent/ClusterVersionJudgement.java deleted file mode 100644 index d068ed733..000000000 --- a/naming/src/main/java/com/alibaba/nacos/naming/consistency/persistent/ClusterVersionJudgement.java +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.alibaba.nacos.naming.consistency.persistent; - -import com.alibaba.nacos.common.utils.StringUtils; -import com.alibaba.nacos.common.utils.VersionUtils; -import com.alibaba.nacos.core.cluster.Member; -import com.alibaba.nacos.core.cluster.MemberMetaDataConstants; -import com.alibaba.nacos.core.cluster.ServerMemberManager; -import com.alibaba.nacos.naming.misc.GlobalExecutor; -import com.alibaba.nacos.sys.env.EnvUtil; -import org.springframework.stereotype.Component; - -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; -import java.util.concurrent.TimeUnit; -import java.util.function.Consumer; - -/** - * An automated task that determines whether all nodes in the current cluster meet the requirements of a particular - * version. - * - *

This will be removed in a future release, just to smooth the transition. - * - * @author liaochuntao - */ -@Component -public class ClusterVersionJudgement { - - private volatile boolean allMemberIsNewVersion = false; - - private final ServerMemberManager memberManager; - - private final List observers = new CopyOnWriteArrayList<>(); - - public ClusterVersionJudgement(ServerMemberManager memberManager) { - this.memberManager = memberManager; - GlobalExecutor.submitClusterVersionJudge(this::runVersionListener, TimeUnit.SECONDS.toMillis(5)); - } - - /** - * register member version watcher. - * - * @param observer Listens for the latest version of all current nodes - * @param priority The higher the priority, the first to be notified - */ - public void registerObserver(Consumer observer, int priority) { - observers.add(new ConsumerWithPriority(observer, priority)); - } - - protected void runVersionListener() { - // Single machine mode or close upgrade feature, do upgrade operation directly. - if (EnvUtil.getStandaloneMode() || !EnvUtil.isSupportUpgradeFrom1X()) { - notifyAllListener(); - return; - } - boolean finish = false; - try { - finish = judge(); - } finally { - if (!finish) { - GlobalExecutor.submitClusterVersionJudge(this::runVersionListener, TimeUnit.SECONDS.toMillis(5)); - } - } - } - - protected boolean judge() { - boolean finish = false; - Collection members = memberManager.allMembers(); - final String oldVersion = "1.4.0"; - boolean allMemberIsNewVersion = true; - for (Member member : members) { - final String curV = (String) member.getExtendVal(MemberMetaDataConstants.VERSION); - if (StringUtils.isBlank(curV) || VersionUtils.compareVersion(oldVersion, curV) > 0) { - allMemberIsNewVersion = false; - } - } - // can only trigger once - if (allMemberIsNewVersion && !this.allMemberIsNewVersion) { - notifyAllListener(); - finish = true; - } - return finish; - } - - private void notifyAllListener() { - this.allMemberIsNewVersion = true; - Collections.sort(observers); - for (ConsumerWithPriority consumer : observers) { - consumer.consumer.accept(true); - } - } - - public boolean allMemberIsNewVersion() { - return allMemberIsNewVersion; - } - - /** - * Only used for upgrade to 2.0.0 - */ - public void reset() { - allMemberIsNewVersion = false; - } - - private static class ConsumerWithPriority implements Comparable { - - private final Consumer consumer; - - private final int priority; - - public ConsumerWithPriority(Consumer consumer, int priority) { - this.consumer = consumer; - this.priority = priority; - } - - @Override - public int compareTo(ConsumerWithPriority o) { - return o.priority - this.priority; - } - } -} diff --git a/naming/src/main/java/com/alibaba/nacos/naming/core/ServiceManager.java b/naming/src/main/java/com/alibaba/nacos/naming/core/ServiceManager.java index 792a50df0..09648b0da 100644 --- a/naming/src/main/java/com/alibaba/nacos/naming/core/ServiceManager.java +++ b/naming/src/main/java/com/alibaba/nacos/naming/core/ServiceManager.java @@ -29,7 +29,6 @@ import com.alibaba.nacos.naming.consistency.ConsistencyService; import com.alibaba.nacos.naming.consistency.Datum; import com.alibaba.nacos.naming.consistency.KeyBuilder; import com.alibaba.nacos.naming.consistency.RecordListener; -import com.alibaba.nacos.naming.core.v2.cleaner.EmptyServiceAutoCleaner; import com.alibaba.nacos.naming.misc.GlobalExecutor; import com.alibaba.nacos.naming.misc.Loggers; import com.alibaba.nacos.naming.misc.Message; @@ -43,7 +42,6 @@ import com.alibaba.nacos.naming.pojo.InstanceOperationInfo; import com.alibaba.nacos.naming.push.UdpPushService; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ArrayNode; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; @@ -96,15 +94,6 @@ public class ServiceManager implements RecordListener { private final UdpPushService pushService; - @Value("${nacos.naming.empty-service.auto-clean:false}") - private boolean emptyServiceAutoClean; - - @Value("${nacos.naming.empty-service.clean.initial-delay-ms:60000}") - private int cleanEmptyServiceDelay; - - @Value("${nacos.naming.empty-service.clean.period-time-ms:20000}") - private int cleanEmptyServicePeriod; - public ServiceManager(SwitchDomain switchDomain, DistroMapper distroMapper, ServerMemberManager memberManager, UdpPushService pushService) { this.switchDomain = switchDomain; @@ -122,22 +111,6 @@ public class ServiceManager implements RecordListener { GlobalExecutor.submitServiceUpdateManager(new UpdatedServiceProcessor()); - if (emptyServiceAutoClean) { - - Loggers.SRV_LOG.info("open empty service auto clean job, initialDelay : {} ms, period : {} ms", - cleanEmptyServiceDelay, cleanEmptyServicePeriod); - - // delay 60s, period 20s; - - // This task is not recommended to be performed frequently in order to avoid - // the possibility that the service cache information may just be deleted - // and then created due to the heartbeat mechanism - - GlobalExecutor - .scheduleServiceAutoClean(new EmptyServiceAutoCleaner(this, distroMapper), cleanEmptyServiceDelay, - cleanEmptyServicePeriod); - } - try { Loggers.SRV_LOG.info("listen for service meta change"); consistencyService.listen(KeyBuilder.SERVICE_META_KEY_PREFIX, this); diff --git a/naming/src/main/java/com/alibaba/nacos/naming/core/v2/cleaner/EmptyServiceAutoCleaner.java b/naming/src/main/java/com/alibaba/nacos/naming/core/v2/cleaner/EmptyServiceAutoCleaner.java deleted file mode 100644 index 1463834ad..000000000 --- a/naming/src/main/java/com/alibaba/nacos/naming/core/v2/cleaner/EmptyServiceAutoCleaner.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright 1999-2020 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.alibaba.nacos.naming.core.v2.cleaner; - -import com.alibaba.nacos.naming.core.DistroMapper; -import com.alibaba.nacos.naming.core.Service; -import com.alibaba.nacos.naming.core.ServiceManager; -import com.alibaba.nacos.naming.misc.Loggers; - -import java.util.Map; -import java.util.stream.Stream; - -/** - * Empty Service Auto Cleaner. - * - * @author xiweng.yy - */ -public class EmptyServiceAutoCleaner extends AbstractNamingCleaner { - - private static final int MAX_FINALIZE_COUNT = 3; - - private final ServiceManager serviceManager; - - private final DistroMapper distroMapper; - - public EmptyServiceAutoCleaner(ServiceManager serviceManager, DistroMapper distroMapper) { - this.serviceManager = serviceManager; - this.distroMapper = distroMapper; - } - - @Override - public void run() { - - // Parallel flow opening threshold - int parallelSize = 100; - - for (String each : serviceManager.getAllNamespaces()) { - Map serviceMap = serviceManager.chooseServiceMap(each); - - Stream> stream; - if (serviceMap.size() > parallelSize) { - stream = serviceMap.entrySet().parallelStream(); - } else { - stream = serviceMap.entrySet().stream(); - } - stream.filter(entry -> { - final String serviceName = entry.getKey(); - return distroMapper.responsible(serviceName); - }).forEach(entry -> serviceMap.computeIfPresent(entry.getKey(), (serviceName, service) -> { - if (service.isEmpty()) { - - // To avoid violent Service removal, the number of times the Service - // experiences Empty is determined by finalizeCnt, and if the specified - // value is reached, it is removed - - if (service.getFinalizeCount() > MAX_FINALIZE_COUNT) { - Loggers.SRV_LOG - .warn("namespace : {}, [{}] services are automatically cleaned", each, serviceName); - try { - serviceManager.easyRemoveService(each, serviceName); - } catch (Exception e) { - Loggers.SRV_LOG - .error("namespace : {}, [{}] services are automatically clean has " + "error : {}", - each, serviceName, e); - } - } - - service.setFinalizeCount(service.getFinalizeCount() + 1); - - Loggers.SRV_LOG.debug("namespace : {}, [{}] The number of times the current service experiences " - + "an empty instance is : {}", each, serviceName, service.getFinalizeCount()); - } else { - service.setFinalizeCount(0); - } - return service; - })); - } - } - - @Override - public String getType() { - return null; - } - - @Override - public void doClean() { - - } -} diff --git a/naming/src/main/java/com/alibaba/nacos/naming/misc/GlobalExecutor.java b/naming/src/main/java/com/alibaba/nacos/naming/misc/GlobalExecutor.java index 6c1cf86a8..11538ecc4 100644 --- a/naming/src/main/java/com/alibaba/nacos/naming/misc/GlobalExecutor.java +++ b/naming/src/main/java/com/alibaba/nacos/naming/misc/GlobalExecutor.java @@ -89,24 +89,6 @@ public class GlobalExecutor { .newFixedExecutorService(ClassUtils.getCanonicalName(NamingApp.class), 2, new NameThreadFactory("com.alibaba.nacos.naming.service.update.http.handler")); - /** - * Empty service auto clean executor. - * - * @deprecated will remove in v2.1.x. - */ - @Deprecated - private static final ScheduledExecutorService EMPTY_SERVICE_AUTO_CLEAN_EXECUTOR = ExecutorFactory.Managed - .newSingleScheduledExecutorService(ClassUtils.getCanonicalName(NamingApp.class), - new NameThreadFactory("com.alibaba.nacos.naming.service.empty.auto-clean")); - - private static final ScheduledExecutorService DISTRO_NOTIFY_EXECUTOR = ExecutorFactory.Managed - .newSingleScheduledExecutorService(ClassUtils.getCanonicalName(NamingApp.class), - new NameThreadFactory("com.alibaba.nacos.naming.distro.notifier")); - - private static final ScheduledExecutorService NAMING_HEALTH_CHECK_EXECUTOR = ExecutorFactory.Managed - .newSingleScheduledExecutorService(ClassUtils.getCanonicalName(NamingApp.class), - new NameThreadFactory("com.alibaba.nacos.naming.health-check.notifier")); - private static final ExecutorService MYSQL_CHECK_EXECUTOR = ExecutorFactory.Managed .newFixedExecutorService(ClassUtils.getCanonicalName(NamingApp.class), DEFAULT_THREAD_COUNT, new NameThreadFactory("com.alibaba.nacos.naming.mysql.checker")); @@ -175,18 +157,6 @@ public class GlobalExecutor { return NAMING_TIMER_EXECUTOR.scheduleWithFixedDelay(runnable, 0, TICK_PERIOD_MS, TimeUnit.MILLISECONDS); } - public static void scheduleMcpPushTask(Runnable runnable, long initialDelay, long period) { - NAMING_TIMER_EXECUTOR.scheduleAtFixedRate(runnable, initialDelay, period, TimeUnit.MILLISECONDS); - } - - public static ScheduledFuture submitClusterVersionJudge(Runnable runnable, long delay) { - return NAMING_TIMER_EXECUTOR.schedule(runnable, delay, TimeUnit.MILLISECONDS); - } - - public static void submitDistroNotifyTask(Runnable runnable) { - DISTRO_NOTIFY_EXECUTOR.submit(runnable); - } - /** * Submit service update for v1.x. * @@ -198,19 +168,6 @@ public class GlobalExecutor { SERVICE_UPDATE_EXECUTOR.execute(runnable); } - /** - * Schedule empty service auto clean for v1.x. - * - * @param runnable runnable - * @param initialDelay initial delay milliseconds - * @param period period between twice clean - * @deprecated will remove in v2.1.x. - */ - @Deprecated - public static void scheduleServiceAutoClean(Runnable runnable, long initialDelay, long period) { - EMPTY_SERVICE_AUTO_CLEAN_EXECUTOR.scheduleAtFixedRate(runnable, initialDelay, period, TimeUnit.MILLISECONDS); - } - /** * submitServiceUpdateManager. * @@ -235,10 +192,6 @@ public class GlobalExecutor { SERVICE_SYNCHRONIZATION_EXECUTOR.schedule(command, delay, unit); } - public static void scheduleNamingHealthCheck(Runnable command, long delay, TimeUnit unit) { - NAMING_HEALTH_CHECK_EXECUTOR.schedule(command, delay, unit); - } - public static void executeMysqlCheckTask(Runnable runnable) { MYSQL_CHECK_EXECUTOR.execute(runnable); } diff --git a/naming/src/test/java/com/alibaba/nacos/naming/core/DomainsManagerTest.java b/naming/src/test/java/com/alibaba/nacos/naming/core/DomainsManagerTest.java deleted file mode 100644 index 63134030d..000000000 --- a/naming/src/test/java/com/alibaba/nacos/naming/core/DomainsManagerTest.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.alibaba.nacos.naming.core; - -import com.alibaba.nacos.api.common.Constants; -import com.alibaba.nacos.api.exception.NacosException; -import com.alibaba.nacos.naming.BaseTest; -import org.junit.Assert; -import org.junit.Test; -import org.mockito.InjectMocks; -import org.mockito.Spy; - -import java.util.List; - -public class DomainsManagerTest extends BaseTest { - - @Spy - @InjectMocks - private ServiceManager manager; - - @Test - public void easyRemoveDom() throws Exception { - Service service = new Service(TEST_SERVICE_NAME); - service.setNamespaceId(TEST_NAMESPACE); - manager.putService(service); - manager.easyRemoveService(TEST_NAMESPACE, TEST_SERVICE_NAME); - } - - @Test - public void easyRemoveDomNotExist() throws Exception { - expectedException.expect(NacosException.class); - expectedException.expectMessage("specified service not exist, serviceName : " + TEST_SERVICE_NAME); - manager.easyRemoveService(Constants.DEFAULT_NAMESPACE_ID, TEST_SERVICE_NAME); - } - - @Test - public void searchDom() { - Service service = new Service(TEST_SERVICE_NAME); - service.setNamespaceId(TEST_NAMESPACE); - manager.putService(service); - - List list = manager.searchServices(TEST_NAMESPACE, "(.*)test(.*)"); - Assert.assertNotNull(list); - Assert.assertEquals(1, list.size()); - Assert.assertEquals(TEST_SERVICE_NAME, list.get(0).getName()); - } -} diff --git a/naming/src/test/java/com/alibaba/nacos/naming/core/ServiceManagerTest.java b/naming/src/test/java/com/alibaba/nacos/naming/core/ServiceManagerTest.java deleted file mode 100644 index d3c1aacf9..000000000 --- a/naming/src/test/java/com/alibaba/nacos/naming/core/ServiceManagerTest.java +++ /dev/null @@ -1,473 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.alibaba.nacos.naming.core; - -import com.alibaba.nacos.api.common.Constants; -import com.alibaba.nacos.api.exception.NacosException; -import com.alibaba.nacos.api.naming.PreservedMetadataKeys; -import com.alibaba.nacos.common.utils.CollectionUtils; -import com.alibaba.nacos.common.utils.JacksonUtils; -import com.alibaba.nacos.common.utils.StringUtils; -import com.alibaba.nacos.core.cluster.ServerMemberManager; -import com.alibaba.nacos.naming.BaseTest; -import com.alibaba.nacos.naming.consistency.ConsistencyService; -import com.alibaba.nacos.naming.consistency.Datum; -import com.alibaba.nacos.naming.consistency.KeyBuilder; -import com.alibaba.nacos.naming.core.ServiceManager.ServiceChecksum; -import com.alibaba.nacos.naming.misc.Message; -import com.alibaba.nacos.naming.misc.Synchronizer; -import com.alibaba.nacos.naming.misc.UtilsAndCommons; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mock; -import org.springframework.test.util.ReflectionTestUtils; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import static com.alibaba.nacos.naming.misc.UtilsAndCommons.UPDATE_INSTANCE_METADATA_ACTION_REMOVE; -import static com.alibaba.nacos.naming.misc.UtilsAndCommons.UPDATE_INSTANCE_METADATA_ACTION_UPDATE; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -public class ServiceManagerTest extends BaseTest { - - private ServiceManager serviceManager; - - @Mock - private ConsistencyService consistencyService; - - @Mock - private Synchronizer synchronizer; - - @Mock - private ServerMemberManager serverMemberManager; - - private Service service; - - private Cluster cluster; - - private Instance instance; - - private Instance instance2; - - private List serviceNames; - - @Before - public void before() { - super.before(); - serviceManager = new ServiceManager(switchDomain, distroMapper, serverMemberManager, pushService); - ReflectionTestUtils.setField(serviceManager, "consistencyService", consistencyService); - ReflectionTestUtils.setField(serviceManager, "synchronizer", synchronizer); - mockInjectSwitchDomain(); - mockInjectDistroMapper(); - mockService(); - mockCluster(); - mockInstance(); - mockServiceName(); - } - - @After - public void tearDown() throws Exception { - service.destroy(); - } - - private void mockService() { - service = new Service(TEST_SERVICE_NAME); - service.setNamespaceId(TEST_NAMESPACE); - } - - private void mockCluster() { - cluster = new Cluster(TEST_CLUSTER_NAME, service); - } - - private void mockInstance() { - instance = new Instance("1.1.1.1", 1, TEST_CLUSTER_NAME); - Map metadata = new HashMap<>(); - metadata.put("key1", "value1"); - instance.setMetadata(metadata); - instance2 = new Instance("2.2.2.2", 2); - } - - private void mockServiceName() { - serviceNames = new ArrayList<>(5); - for (int i = 0; i < 32; i++) { - serviceNames.add(String.valueOf(i)); - } - } - - @Test - public void testGetAllNamespaces() throws NacosException { - assertTrue(serviceManager.getAllNamespaces().isEmpty()); - serviceManager.createEmptyService(TEST_NAMESPACE, TEST_SERVICE_NAME, true); - assertFalse(serviceManager.getAllNamespaces().isEmpty()); - assertEquals(1, serviceManager.getAllNamespaces().size()); - assertEquals(TEST_NAMESPACE, serviceManager.getAllNamespaces().iterator().next()); - } - - @Test - public void testGetAllServiceNames() throws NacosException { - assertTrue(serviceManager.getAllServiceNames().isEmpty()); - serviceManager.createEmptyService(TEST_NAMESPACE, TEST_SERVICE_NAME, true); - assertFalse(serviceManager.getAllServiceNames().isEmpty()); - assertEquals(1, serviceManager.getAllServiceNames().size()); - assertEquals(1, serviceManager.getAllServiceNames(TEST_NAMESPACE).size()); - assertEquals(TEST_SERVICE_NAME, serviceManager.getAllServiceNames(TEST_NAMESPACE).iterator().next()); - } - - @Test - public void testGetAllServiceNamesOrder() throws NacosException { - assertTrue(serviceManager.getAllServiceNames().isEmpty()); - for (String serviceName : serviceNames) { - serviceManager.createEmptyService(TEST_NAMESPACE, serviceName, true); - } - assertFalse(serviceManager.getAllServiceNames().isEmpty()); - assertEquals(1, serviceManager.getAllServiceNames().size()); - assertEquals(serviceNames.size(), serviceManager.getAllServiceNames(TEST_NAMESPACE).size()); - Collections.sort(serviceNames); - Iterator iterator = serviceManager.getAllServiceNames(TEST_NAMESPACE).iterator(); - int index = 0; - while (iterator.hasNext()) { - String next = iterator.next(); - assertEquals(next, serviceNames.get(index)); - index++; - } - } - - @Test - public void testGetAllServiceNameList() throws NacosException { - assertTrue(serviceManager.getAllServiceNameList(TEST_NAMESPACE).isEmpty()); - serviceManager.createEmptyService(TEST_NAMESPACE, TEST_SERVICE_NAME, true); - assertFalse(serviceManager.getAllServiceNameList(TEST_NAMESPACE).isEmpty()); - assertEquals(1, serviceManager.getAllServiceNameList(TEST_NAMESPACE).size()); - assertEquals(TEST_SERVICE_NAME, serviceManager.getAllServiceNameList(TEST_NAMESPACE).get(0)); - } - - @Test - public void testGetAllServiceNameListOrder() throws NacosException { - assertTrue(serviceManager.getAllServiceNameList(TEST_NAMESPACE).isEmpty()); - for (String serviceName : serviceNames) { - serviceManager.createEmptyService(TEST_NAMESPACE, serviceName, true); - } - assertFalse(serviceManager.getAllServiceNameList(TEST_NAMESPACE).isEmpty()); - assertEquals(serviceNames.size(), serviceManager.getAllServiceNameList(TEST_NAMESPACE).size()); - List allServiceNameList = serviceManager.getAllServiceNameList(TEST_NAMESPACE); - Collections.sort(serviceNames); - for (int i = 0; i < allServiceNameList.size(); i++) { - assertEquals(allServiceNameList.get(i), serviceNames.get(i)); - } - } - - @Test - public void testGetResponsibleServices() throws NacosException { - when(distroMapper.responsible(TEST_SERVICE_NAME)).thenReturn(true); - assertEquals(0, serviceManager.getResponsibleServiceCount()); - serviceManager.createEmptyService(TEST_NAMESPACE, TEST_SERVICE_NAME, true); - assertEquals(1, serviceManager.getResponsibleServiceCount()); - assertEquals(TEST_SERVICE_NAME, - serviceManager.getResponsibleServices().get(TEST_NAMESPACE).iterator().next().getName()); - } - - @Test - public void getResponsibleInstanceCount() throws NacosException { - when(distroMapper.responsible(TEST_SERVICE_NAME)).thenReturn(true); - assertEquals(0, serviceManager.getResponsibleInstanceCount()); - serviceManager.createEmptyService(TEST_NAMESPACE, TEST_SERVICE_NAME, true); - Service service = serviceManager.getService(TEST_NAMESPACE, TEST_SERVICE_NAME); - service.addCluster(cluster); - ((Set) ReflectionTestUtils.getField(cluster, "ephemeralInstances")).add(instance); - assertEquals(1, serviceManager.getResponsibleInstanceCount()); - } - - @Test - public void testCreateEmptyServiceForEphemeral() throws NacosException { - assertFalse(serviceManager.containService(TEST_NAMESPACE, TEST_SERVICE_NAME)); - assertEquals(0, serviceManager.getServiceCount()); - serviceManager.createServiceIfAbsent(TEST_NAMESPACE, TEST_SERVICE_NAME, true, - new Cluster(TEST_CLUSTER_NAME, service)); - assertTrue(serviceManager.containService(TEST_NAMESPACE, TEST_SERVICE_NAME)); - assertEquals(1, serviceManager.getServiceCount()); - verify(consistencyService).listen(eq(KeyBuilder.buildInstanceListKey(TEST_NAMESPACE, TEST_SERVICE_NAME, true)), - any(Service.class)); - verify(consistencyService).listen(eq(KeyBuilder.buildInstanceListKey(TEST_NAMESPACE, TEST_SERVICE_NAME, false)), - any(Service.class)); - verify(consistencyService, never()) - .put(eq(KeyBuilder.buildServiceMetaKey(TEST_NAMESPACE, TEST_SERVICE_NAME)), any(Service.class)); - } - - @Test - public void testCreateEmptyServiceForPersistent() throws NacosException { - assertFalse(serviceManager.containService(TEST_NAMESPACE, TEST_SERVICE_NAME)); - assertEquals(0, serviceManager.getServiceCount()); - serviceManager.createServiceIfAbsent(TEST_NAMESPACE, TEST_SERVICE_NAME, false, - new Cluster(TEST_CLUSTER_NAME, service)); - assertTrue(serviceManager.containService(TEST_NAMESPACE, TEST_SERVICE_NAME)); - assertEquals(1, serviceManager.getServiceCount()); - verify(consistencyService).listen(eq(KeyBuilder.buildInstanceListKey(TEST_NAMESPACE, TEST_SERVICE_NAME, true)), - any(Service.class)); - verify(consistencyService).listen(eq(KeyBuilder.buildInstanceListKey(TEST_NAMESPACE, TEST_SERVICE_NAME, false)), - any(Service.class)); - verify(consistencyService) - .put(eq(KeyBuilder.buildServiceMetaKey(TEST_NAMESPACE, TEST_SERVICE_NAME)), any(Service.class)); - } - - @Test - public void testEasyRemoveServiceSuccessfully() throws Exception { - serviceManager.createEmptyService(TEST_NAMESPACE, TEST_SERVICE_NAME, true); - serviceManager.easyRemoveService(TEST_NAMESPACE, TEST_SERVICE_NAME); - verify(consistencyService).remove(KeyBuilder.buildServiceMetaKey(TEST_NAMESPACE, TEST_SERVICE_NAME)); - } - - @Test - public void testEasyRemoveServiceFailed() throws Exception { - expectedException.expect(NacosException.class); - expectedException.expectMessage("specified service not exist, serviceName : " + TEST_SERVICE_NAME); - serviceManager.easyRemoveService(TEST_NAMESPACE, TEST_SERVICE_NAME); - } - - @Test - public void testRegisterInstance() throws NacosException { - assertEquals(0, serviceManager.getInstanceCount()); - serviceManager.registerInstance(TEST_NAMESPACE, TEST_SERVICE_NAME, instance); - String instanceListKey = KeyBuilder.buildInstanceListKey(TEST_NAMESPACE, TEST_SERVICE_NAME, true); - verify(consistencyService).put(eq(instanceListKey), any(Instances.class)); - } - - @Test - public void testUpdateInstance() throws NacosException { - serviceManager.createEmptyService(TEST_NAMESPACE, TEST_SERVICE_NAME, true); - Service service = serviceManager.getService(TEST_NAMESPACE, TEST_SERVICE_NAME); - service.addCluster(cluster); - ((Set) ReflectionTestUtils.getField(cluster, "ephemeralInstances")).add(instance); - serviceManager.updateInstance(TEST_NAMESPACE, TEST_SERVICE_NAME, instance); - String instanceListKey = KeyBuilder.buildInstanceListKey(TEST_NAMESPACE, TEST_SERVICE_NAME, true); - verify(consistencyService).put(eq(instanceListKey), any(Instances.class)); - } - - @Test - public void testUpdateMetadata() throws NacosException { - - serviceManager.createEmptyService(TEST_NAMESPACE, TEST_SERVICE_NAME, true); - - List instanceList = new LinkedList<>(); - Datum datam = new Datum(); - datam.key = KeyBuilder.buildInstanceListKey(TEST_NAMESPACE, TEST_SERVICE_NAME, true); - Instances instances = new Instances(); - instanceList.add(instance); - instanceList.add(instance2); - instances.setInstanceList(instanceList); - datam.value = instances; - when(consistencyService.get(KeyBuilder.buildInstanceListKey(TEST_NAMESPACE, TEST_SERVICE_NAME, true))) - .thenReturn(datam); - - Instance updateMetadataInstance = new Instance(); - updateMetadataInstance.setIp(instance.getIp()); - updateMetadataInstance.setPort(instance.getPort()); - updateMetadataInstance.setClusterName(cluster.getName()); - updateMetadataInstance.setEphemeral(instance.isEphemeral()); - - Map updateMetadata = new HashMap<>(16); - updateMetadata.put("key1", "new-value1"); - updateMetadata.put("key2", "value2"); - updateMetadataInstance.setMetadata(updateMetadata); - - //all=false, update input instances - serviceManager - .updateMetadata(TEST_NAMESPACE, TEST_SERVICE_NAME, true, UPDATE_INSTANCE_METADATA_ACTION_UPDATE, false, - CollectionUtils.list(updateMetadataInstance), updateMetadata); - - assertEquals(instance.getMetadata().get("key1"), "new-value1"); - assertEquals(instance.getMetadata().get("key2"), "value2"); - - //all=true, update all instances - serviceManager - .updateMetadata(TEST_NAMESPACE, TEST_SERVICE_NAME, true, UPDATE_INSTANCE_METADATA_ACTION_UPDATE, true, - null, updateMetadata); - - assertEquals(instance2.getMetadata().get("key1"), "new-value1"); - assertEquals(instance2.getMetadata().get("key2"), "value2"); - - Instance deleteMetadataInstance = new Instance(); - deleteMetadataInstance.setIp(instance.getIp()); - deleteMetadataInstance.setPort(instance.getPort()); - deleteMetadataInstance.setClusterName(cluster.getName()); - deleteMetadataInstance.setEphemeral(instance.isEphemeral()); - Map deleteMetadata = new HashMap<>(16); - deleteMetadata.put("key2", null); - deleteMetadata.put("key3", null); - updateMetadataInstance.setMetadata(deleteMetadata); - - serviceManager - .updateMetadata(TEST_NAMESPACE, TEST_SERVICE_NAME, true, UPDATE_INSTANCE_METADATA_ACTION_REMOVE, false, - CollectionUtils.list(deleteMetadataInstance), deleteMetadata); - - assertEquals(instance.getMetadata().get("key1"), "new-value1"); - assertNull(instance.getMetadata().get("key2")); - assertNull(instance.getMetadata().get("key3")); - - serviceManager - .updateMetadata(TEST_NAMESPACE, TEST_SERVICE_NAME, true, UPDATE_INSTANCE_METADATA_ACTION_REMOVE, true, - null, deleteMetadata); - - assertEquals(instance2.getMetadata().get("key1"), "new-value1"); - assertNull(instance2.getMetadata().get("key2")); - assertNull(instance2.getMetadata().get("key3")); - } - - @Test - public void testRemoveInstance() throws NacosException { - serviceManager.createEmptyService(TEST_NAMESPACE, TEST_SERVICE_NAME, true); - serviceManager.removeInstance(TEST_NAMESPACE, TEST_SERVICE_NAME, true, instance); - String instanceListKey = KeyBuilder.buildInstanceListKey(TEST_NAMESPACE, TEST_SERVICE_NAME, true); - verify(consistencyService).put(eq(instanceListKey), any(Instances.class)); - } - - @Test - public void testGetInstance() throws NacosException { - assertNull(serviceManager.getInstance(TEST_NAMESPACE, TEST_SERVICE_NAME, TEST_CLUSTER_NAME, "1.1.1.1", 1)); - serviceManager.createEmptyService(TEST_NAMESPACE, TEST_SERVICE_NAME, true); - assertNull(serviceManager.getInstance(TEST_NAMESPACE, TEST_SERVICE_NAME, TEST_CLUSTER_NAME, "1.1.1.1", 1)); - Service service = serviceManager.getService(TEST_NAMESPACE, TEST_SERVICE_NAME); - service.addCluster(cluster); - ((Set) ReflectionTestUtils.getField(cluster, "ephemeralInstances")).add(instance); - assertEquals(instance, - serviceManager.getInstance(TEST_NAMESPACE, TEST_SERVICE_NAME, TEST_CLUSTER_NAME, "1.1.1.1", 1)); - assertNull(serviceManager.getInstance(TEST_NAMESPACE, TEST_SERVICE_NAME, TEST_CLUSTER_NAME, "2.2.2.2", 2)); - } - - @Test - public void testUpdateIpAddresses() throws Exception { - List instanceList = serviceManager - .updateIpAddresses(service, UtilsAndCommons.UPDATE_INSTANCE_ACTION_ADD, true, instance); - Assert.assertEquals(1, instanceList.size()); - Assert.assertEquals(instance, instanceList.get(0)); - Assert.assertEquals(1, service.getClusterMap().size()); - Assert.assertEquals(new Cluster(instance.getClusterName(), service), - service.getClusterMap().get(TEST_CLUSTER_NAME)); - - Datum datam = new Datum(); - datam.key = KeyBuilder.buildInstanceListKey(TEST_NAMESPACE, TEST_SERVICE_NAME, true); - Instances instances = new Instances(); - instanceList.add(instance2); - instances.setInstanceList(instanceList); - datam.value = instances; - when(consistencyService.get(KeyBuilder.buildInstanceListKey(TEST_NAMESPACE, TEST_SERVICE_NAME, true))) - .thenReturn(datam); - service.getClusterMap().get(TEST_CLUSTER_NAME).updateIps(instanceList, true); - instanceList = serviceManager - .updateIpAddresses(service, UtilsAndCommons.UPDATE_INSTANCE_ACTION_REMOVE, true, instance); - Assert.assertEquals(1, instanceList.size()); - Assert.assertEquals(instance2, instanceList.get(0)); - Assert.assertEquals(1, service.getClusterMap().size()); - Assert.assertEquals(new Cluster(instance.getClusterName(), service), - service.getClusterMap().get(TEST_CLUSTER_NAME)); - } - - @Test - public void testUpdateIpAddressesNoInstance() throws Exception { - expectedException.expect(IllegalArgumentException.class); - expectedException - .expectMessage(String.format("ip list can not be empty, service: %s, ip list: []", TEST_SERVICE_NAME)); - serviceManager.updateIpAddresses(service, UtilsAndCommons.UPDATE_INSTANCE_ACTION_ADD, true); - } - - @Test - public void testSearchServices() throws NacosException { - serviceManager.createEmptyService(TEST_NAMESPACE, TEST_SERVICE_NAME, true); - List actual = serviceManager - .searchServices(TEST_NAMESPACE, Constants.ANY_PATTERN + TEST_SERVICE_NAME + Constants.ANY_PATTERN); - assertEquals(1, actual.size()); - assertEquals(TEST_SERVICE_NAME, actual.get(0).getName()); - } - - @Test - public void testGetPagedService() throws NacosException { - serviceManager.createEmptyService(TEST_NAMESPACE, TEST_SERVICE_NAME, true); - Service service = serviceManager.getService(TEST_NAMESPACE, TEST_SERVICE_NAME); - service.addCluster(cluster); - ((Set) ReflectionTestUtils.getField(cluster, "ephemeralInstances")).add(instance); - List actualServices = new ArrayList<>(8); - int actualSize = serviceManager - .getPagedService(TEST_NAMESPACE, 0, 10, StringUtils.EMPTY, "1.1.1.1:1", actualServices, true); - assertEquals(1, actualSize); - assertEquals(TEST_SERVICE_NAME, actualServices.get(0).getName()); - } - - @Test - public void testSnowflakeInstanceId() throws Exception { - Map metaData = new HashMap<>(); - metaData.put(PreservedMetadataKeys.INSTANCE_ID_GENERATOR, Constants.SNOWFLAKE_INSTANCE_ID_GENERATOR); - - instance.setMetadata(metaData); - - instance2.setClusterName(TEST_CLUSTER_NAME); - instance2.setMetadata(metaData); - - List instanceList = serviceManager - .updateIpAddresses(service, UtilsAndCommons.UPDATE_INSTANCE_ACTION_ADD, true, instance, instance2); - Assert.assertNotNull(instanceList); - Assert.assertEquals(2, instanceList.size()); - int instanceId1 = Integer.parseInt(instance.getInstanceId()); - int instanceId2 = Integer.parseInt(instance2.getInstanceId()); - Assert.assertNotEquals(instanceId1, instanceId2); - } - - @Test - public void testUpdatedHealthStatus() { - String namespaceId = "namespaceId"; - String serviceName = "testService"; - String serverIp = "127.0.0.1"; - String example = "{\"ips\":[\"127.0.0.1:8848_true\"]}"; - Message message = new Message(); - message.setData(example); - when(synchronizer.get(serverIp, UtilsAndCommons.assembleFullServiceName(namespaceId, serviceName))) - .thenReturn(message); - serviceManager.updatedHealthStatus(namespaceId, serviceName, serverIp); - } - - @Test - public void testSerializeServiceChecksum() { - ServiceChecksum checksum = new ServiceChecksum(); - checksum.addItem("test", "1234567890"); - String actual = JacksonUtils.toJson(checksum); - assertTrue(actual.contains("\"namespaceId\":\"public\"")); - assertTrue(actual.contains("\"serviceName2Checksum\":{\"test\":\"1234567890\"}")); - } - - @Test(expected = NacosException.class) - public void testCheckServiceIsNull() throws NacosException { - serviceManager.createEmptyService(TEST_NAMESPACE, TEST_SERVICE_NAME, true); - String serviceName = "order-service"; - Service service = serviceManager.getService(TEST_NAMESPACE, serviceName); - serviceManager.checkServiceIsNull(service, TEST_NAMESPACE, serviceName); - } -} diff --git a/naming/src/test/java/com/alibaba/nacos/naming/core/v2/cleaner/EmptyServiceAutoCleanerTest.java b/naming/src/test/java/com/alibaba/nacos/naming/core/v2/cleaner/EmptyServiceAutoCleanerTest.java deleted file mode 100644 index 7630c5e5a..000000000 --- a/naming/src/test/java/com/alibaba/nacos/naming/core/v2/cleaner/EmptyServiceAutoCleanerTest.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright 1999-2021 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package com.alibaba.nacos.naming.core.v2.cleaner; - -import com.alibaba.nacos.naming.core.DistroMapper; -import com.alibaba.nacos.naming.core.Service; -import com.alibaba.nacos.naming.core.ServiceManager; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.junit.MockitoJUnitRunner; - -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; - -/** - * {@link EmptyServiceAutoCleaner} unit test. - * - * @author chenglu - * @date 2021-07-21 12:31 - */ -@RunWith(MockitoJUnitRunner.class) -public class EmptyServiceAutoCleanerTest { - - @Mock - private ServiceManager serviceManager; - - @Mock - private DistroMapper distroMapper; - - private EmptyServiceAutoCleaner emptyServiceAutoCleaner; - - @Before - public void setUp() { - emptyServiceAutoCleaner = new EmptyServiceAutoCleaner(serviceManager, distroMapper); - } - - @Test - public void testRun() { - try { - Mockito.when(serviceManager.getAllNamespaces()).thenReturn(Collections.singleton("test")); - - Map serviceMap = new HashMap<>(2); - Service service = new Service(); - serviceMap.put("test", service); - Mockito.when(serviceManager.chooseServiceMap(Mockito.anyString())).thenReturn(serviceMap); - - Mockito.when(distroMapper.responsible(Mockito.anyString())).thenReturn(true); - - emptyServiceAutoCleaner.run(); - } catch (Exception e) { - e.printStackTrace(); - Assert.fail(e.getMessage()); - } - } -}