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) {

Reply via email to