1
0
mirror of https://github.com/apache/dubbo.git synced 2024-10-23 07:04:37 +08:00

Skip mapping retry if metadata config is invalid (#11323)

* Skip mapping retry if metadata config is invalid

* Fix uts
This commit is contained in:
Albumen Kevin 2023-02-15 15:50:35 +08:00 committed by GitHub
parent 6d28a1a4b1
commit d874a87303
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 126 additions and 23 deletions

View File

@ -287,7 +287,7 @@ public class ServiceConfig<T> extends ServiceConfigBase<T> {
} catch (Exception e) {
logger.error(CONFIG_SERVER_DISCONNECTED, "configuration server disconnected", "", "Failed register interface application mapping for service " + url.getServiceKey(), e);
}
if (!succeeded) {
if (!succeeded && serviceNameMapping.hasValidMetadataCenter()) {
scheduleToMapping(scheduledExecutor, serviceNameMapping, url);
}
}

View File

@ -17,14 +17,6 @@
package org.apache.dubbo.config;
import java.util.Collections;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.atomic.AtomicInteger;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.extension.ExtensionLoader;
import org.apache.dubbo.config.api.DemoService;
@ -44,13 +36,21 @@ import org.apache.dubbo.rpc.Protocol;
import org.apache.dubbo.rpc.model.ApplicationModel;
import org.apache.dubbo.rpc.model.FrameworkModel;
import org.apache.dubbo.rpc.service.GenericService;
import com.google.common.collect.Lists;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import com.google.common.collect.Lists;
import java.util.Collections;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.atomic.AtomicInteger;
import static org.apache.dubbo.common.constants.CommonConstants.ANYHOST_KEY;
import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY;
@ -80,7 +80,10 @@ import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertSame;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.withSettings;
class ServiceConfigTest {
@ -568,6 +571,11 @@ class ServiceConfigTest {
return count.get() > 10;
}
@Override
public boolean hasValidMetadataCenter() {
return true;
}
@Override
public void initInterfaceAppMapping(URL subscribedURL) {
@ -626,4 +634,83 @@ class ServiceConfigTest {
await().until(() -> count.get() > 10);
scheduledExecutorService.shutdown();
}
@Test
void testMappingNoRetry() {
FrameworkModel frameworkModel = new FrameworkModel();
ApplicationModel applicationModel = frameworkModel.newApplication();
ServiceConfig<DemoService> serviceConfig = new ServiceConfig<>(applicationModel.newModule());
serviceConfig.exported();
ScheduledExecutorService scheduledExecutorService = Mockito.spy(Executors.newScheduledThreadPool(1));
AtomicInteger count = new AtomicInteger(0);
ServiceNameMapping serviceNameMapping = new ServiceNameMapping() {
@Override
public boolean map(URL url) {
return false;
}
@Override
public boolean hasValidMetadataCenter() {
return false;
}
@Override
public void initInterfaceAppMapping(URL subscribedURL) {
}
@Override
public Set<String> getAndListen(URL registryURL, URL subscribedURL, MappingListener listener) {
return null;
}
@Override
public MappingListener stopListen(URL subscribeURL, MappingListener listener) {
return null;
}
@Override
public void putCachedMapping(String serviceKey, Set<String> apps) {
}
@Override
public Set<String> getCachedMapping(String mappingKey) {
return null;
}
@Override
public Set<String> getCachedMapping(URL consumerURL) {
return null;
}
@Override
public Set<String> getRemoteMapping(URL consumerURL) {
return null;
}
@Override
public Map<String, Set<String>> getCachedMapping() {
return null;
}
@Override
public Set<String> removeCachedMapping(String serviceKey) {
return null;
}
@Override
public void $destroy() {
}
};
ApplicationConfig applicationConfig = new ApplicationConfig("app");
applicationConfig.setMappingRetryInterval(10);
serviceConfig.setApplication(applicationConfig);
serviceConfig.mapServiceName(URL.valueOf(""), serviceNameMapping, scheduledExecutorService);
verify(scheduledExecutorService, times(0)).schedule((Runnable) any(), anyLong(), any());
scheduledExecutorService.shutdown();
}
}

View File

@ -16,6 +16,11 @@
*/
package org.apache.dubbo.metadata;
import java.util.Arrays;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.extension.SPI;
import org.apache.dubbo.common.utils.CollectionUtils;
@ -24,11 +29,6 @@ import org.apache.dubbo.rpc.model.ScopeModel;
import org.apache.dubbo.rpc.model.ScopeModelUtil;
import org.apache.dubbo.rpc.service.Destroyable;
import java.util.Arrays;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import static java.util.Collections.emptySet;
import static org.apache.dubbo.common.constants.CommonConstants.COMMA_SEPARATOR;
import static org.apache.dubbo.common.extension.ExtensionScope.APPLICATION;
@ -48,6 +48,8 @@ public interface ServiceNameMapping extends Destroyable {
*/
boolean map(URL url);
boolean hasValidMetadataCenter();
/**
* Get the default extension of {@link ServiceNameMapping}
*

View File

@ -16,19 +16,18 @@
*/
package org.apache.dubbo.metadata;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.rpc.model.ApplicationModel;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.rpc.model.ApplicationModel;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.apache.dubbo.common.constants.RegistryConstants.PROVIDED_BY;
import static org.apache.dubbo.common.constants.RegistryConstants.SUBSCRIBED_SERVICE_NAMES_KEY;
@ -126,6 +125,11 @@ class AbstractServiceNameMappingTest {
public boolean map(URL url) {
return false;
}
@Override
public boolean hasValidMetadataCenter() {
return false;
}
}
private class MockServiceNameMapping2 extends AbstractServiceNameMapping {
@ -158,6 +162,11 @@ class AbstractServiceNameMappingTest {
public boolean map(URL url) {
return false;
}
@Override
public boolean hasValidMetadataCenter() {
return false;
}
}
}

View File

@ -63,6 +63,11 @@ public class MetadataServiceNameMapping extends AbstractServiceNameMapping {
casRetryWaitTime = ConfigurationUtils.getGlobalConfiguration(applicationModel).getInt(CAS_RETRY_WAIT_TIME_KEY, DEFAULT_CAS_RETRY_WAIT_TIME);
}
@Override
public boolean hasValidMetadataCenter() {
return !CollectionUtils.isEmpty(applicationModel.getApplicationConfigManager().getMetadataConfigs());
}
/**
* Simply register to all metadata center
*/