This is an automated email from the ASF dual-hosted git repository.
albumenj pushed a commit to branch 3.0
in repository https://gitbox.apache.org/repos/asf/dubbo.git
The following commit(s) were added to refs/heads/3.0 by this push:
new 7e33452 [3.0] Ensure generated config id is unique, checking existed
config (#8322)
7e33452 is described below
commit 7e334527b50f35d77f659c87e2cddae180e84cb2
Author: Gong Dewei <[email protected]>
AuthorDate: Fri Aug 6 12:46:45 2021 +0800
[3.0] Ensure generated config id is unique, checking existed config (#8322)
* ensure generated config id is unique, checking existed config
* Improve generating config-center/metadata-report config from registry
* override existed config with same id
---
.../apache/dubbo/config/context/ConfigManager.java | 25 ++++++++++------
.../dubbo/config/bootstrap/DubboBootstrap.java | 33 ++++++++++++++--------
2 files changed, 38 insertions(+), 20 deletions(-)
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/config/context/ConfigManager.java
b/dubbo-common/src/main/java/org/apache/dubbo/config/context/ConfigManager.java
index 82295c2..5d7584c 100644
---
a/dubbo-common/src/main/java/org/apache/dubbo/config/context/ConfigManager.java
+++
b/dubbo-common/src/main/java/org/apache/dubbo/config/context/ConfigManager.java
@@ -645,7 +645,7 @@ public class ConfigManager extends LifecycleAdapter
implements FrameworkExt {
case IGNORE: {
// ignore later config
if (logger.isWarnEnabled() &&
duplicatedConfigs.add(config)) {
- logger.warn(msgPrefix + "keep previous config and
ignore later config: " + config);
+ logger.warn(msgPrefix + "keep previous config and
ignore later config");
}
return oldOne;
}
@@ -653,7 +653,7 @@ public class ConfigManager extends LifecycleAdapter
implements FrameworkExt {
// clear previous config, add new config
configsMap.clear();
if (logger.isWarnEnabled() &&
duplicatedConfigs.add(config)) {
- logger.warn(msgPrefix + "override previous config with
later config: " + config);
+ logger.warn(msgPrefix + "override previous config with
later config");
}
break;
}
@@ -662,16 +662,22 @@ public class ConfigManager extends LifecycleAdapter
implements FrameworkExt {
String key = getId(config);
if (key == null) {
- // generate key for non-default config compatible with API usages
- key = generateConfigId(config);
+ do {
+ // generate key if id is not set
+ key = generateConfigId(config);
+ } while (configsMap.containsKey(key));
}
- C existedConfig = configsMap.putIfAbsent(key, config);
- if (isEquals(existedConfig, config)) {
+ C existedConfig = configsMap.get(key);
+ if (existedConfig != null && !isEquals(existedConfig, config)) {
String type = config.getClass().getSimpleName();
- throw new IllegalStateException(String.format("Duplicate %s found,
there already has one default %s or more than two %ss have the same id, " +
- "you can try to give each %s a different id, key: %s,
prev: %s, new: %s", type, type, type, type, key, existedConfig, config));
+ logger.warn(String.format("Duplicate %s found, there already has
one default %s or more than two %ss have the same id, " +
+ "you can try to give each %s a different id, override
previous config with later config. id: %s, prev: %s, later: %s",
+ type, type, type, type, key, existedConfig, config));
}
+
+ // override existed config if any
+ configsMap.put(key, config);
return config;
}
@@ -716,6 +722,9 @@ public class ConfigManager extends LifecycleAdapter
implements FrameworkExt {
if (prevConfig.equals(config)) {
// TODO Is there any problem with ignoring duplicate and
equivalent but different ReferenceConfig instances?
+ if (logger.isWarnEnabled() && duplicatedConfigs.add(config)) {
+ logger.warn("Ignore duplicated and equal config: "+config);
+ }
return prevConfig;
}
diff --git
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/bootstrap/DubboBootstrap.java
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/bootstrap/DubboBootstrap.java
index 9d4c4d1..9d7925f 100644
---
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/bootstrap/DubboBootstrap.java
+++
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/bootstrap/DubboBootstrap.java
@@ -84,6 +84,7 @@ import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
+import java.util.Optional;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
@@ -769,6 +770,7 @@ public class DubboBootstrap {
for (MetadataReportConfig metadataReportConfig :
metadataReportConfigs) {
ConfigValidationUtils.validateMetadataConfig(metadataReportConfig);
if (!metadataReportConfig.isValid()) {
+ logger.info("Ignore invalid metadata-report config: " +
metadataReportConfig);
continue;
}
MetadataReportInstance.init(metadataReportConfig);
@@ -799,11 +801,14 @@ public class DubboBootstrap {
.stream()
.filter(this::isUsedRegistryAsConfigCenter)
.map(this::registryAsConfigCenter)
- .forEach(configManager::addConfigCenter);
+ .forEach(configCenter -> {
+ if
(configManager.getConfigCenter(configCenter.getId()).isPresent()) {
+ return;
+ }
+ configManager.addConfigCenter(configCenter);
+ logger.info("use registry as config-center: " +
configCenter);
- if (configManager.getConfigCenters().size() > 0) {
- logger.info("use registry as config-center: " +
configManager.getConfigCenters());
- }
+ });
}
}
@@ -815,7 +820,8 @@ public class DubboBootstrap {
private ConfigCenterConfig registryAsConfigCenter(RegistryConfig
registryConfig) {
String protocol = registryConfig.getProtocol();
Integer port = registryConfig.getPort();
- String id = "config-center-" + protocol + "-" + port;
+ URL url = URL.valueOf(registryConfig.getAddress());
+ String id = "config-center-" + protocol + "-" + url.getHost() + "-" +
port;
ConfigCenterConfig cc = new ConfigCenterConfig();
cc.setId(id);
if (cc.getParameters() == null) {
@@ -855,11 +861,14 @@ public class DubboBootstrap {
.stream()
.filter(this::isUsedRegistryAsMetadataCenter)
.map(this::registryAsMetadataCenter)
- .forEach(configManager::addMetadataReport);
-
- if (configManager.getMetadataConfigs().size() > 0) {
- logger.info("use registry as metadata-center: " +
configManager.getMetadataConfigs());
- }
+ .forEach(metadataReportConfig -> {
+ Optional<MetadataReportConfig> configOptional =
configManager.getConfig(MetadataReportConfig.class,
metadataReportConfig.getId());
+ if (configOptional.isPresent()) {
+ return;
+ }
+ configManager.addMetadataReport(metadataReportConfig);
+ logger.info("use registry as metadata-center: " +
metadataReportConfig);
+ });
}
}
@@ -920,8 +929,8 @@ public class DubboBootstrap {
private MetadataReportConfig registryAsMetadataCenter(RegistryConfig
registryConfig) {
String protocol = registryConfig.getProtocol();
- Integer port = registryConfig.getPort();
- String id = "metadata-center-" + protocol + "-" + port;
+ URL url = URL.valueOf(registryConfig.getAddress());
+ String id = "metadata-center-" + protocol + "-" + url.getHost() + "-"
+ url.getPort();
MetadataReportConfig metadataReportConfig = new MetadataReportConfig();
metadataReportConfig.setId(id);
if (metadataReportConfig.getParameters() == null) {