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 6443767caf unexport and delete config (#10369)
6443767caf is described below

commit 6443767caf1f37800532900c5d4512461868b4ce
Author: Owen.Cai <[email protected]>
AuthorDate: Wed Jul 27 17:31:13 2022 +0800

    unexport and delete config (#10369)
    
    * unexport and delete config
    
    * fix no id null bug
    
    * fix code bug
---
 .../config/context/AbstractConfigManager.java      | 12 +++++++++-
 .../dubbo/config/context/ModuleConfigManager.java  | 26 ++++++++++++++++++++++
 2 files changed, 37 insertions(+), 1 deletion(-)

diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/config/context/AbstractConfigManager.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/config/context/AbstractConfigManager.java
index 81c8b068cb..2078bd9c29 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/config/context/AbstractConfigManager.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/config/context/AbstractConfigManager.java
@@ -223,6 +223,13 @@ public abstract class AbstractConfigManager extends 
LifecycleAdapter {
         return config;
     }
 
+    protected <C extends AbstractConfig> boolean removeIfAbsent(C config, 
Map<String, C> configsMap) {
+        if(config.getId() != null) {
+            return configsMap.remove(config.getId(), config);
+        }
+        return configsMap.values().removeIf(c -> config == c);
+    }
+
     protected boolean isUniqueConfig(AbstractConfig config) {
         if (uniqueConfigTypes.contains(config.getClass())) {
             return true;
@@ -651,7 +658,10 @@ public abstract class AbstractConfigManager extends 
LifecycleAdapter {
 
         Map<String, AbstractConfig> configs = 
configsCache.get(getTagName(config.getClass()));
         if (CollectionUtils.isNotEmptyMap(configs)) {
-            return configs.values().removeIf(c -> config == c);
+            // lock by config type
+            synchronized (configs) {
+                return removeIfAbsent(config, configs);
+            }
         }
         return false;
     }
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/config/context/ModuleConfigManager.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/config/context/ModuleConfigManager.java
index b05f24f155..c7af4f2454 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/config/context/ModuleConfigManager.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/config/context/ModuleConfigManager.java
@@ -202,6 +202,17 @@ public class ModuleConfigManager extends 
AbstractConfigManager implements Module
         return Optional.empty();
     }
 
+    @Override
+    protected <C extends AbstractConfig> boolean removeIfAbsent(C config, 
Map<String, C> configsMap) {
+        if(super.removeIfAbsent(config, configsMap)) {
+            if (config instanceof ReferenceConfigBase || config instanceof 
ServiceConfigBase) {
+                removeInterfaceConfig((AbstractInterfaceConfig) config);
+            }
+            return true;
+        }
+        return false;
+    }
+
     /**
      * check duplicated ReferenceConfig/ServiceConfig
      *
@@ -250,6 +261,21 @@ public class ModuleConfigManager extends 
AbstractConfigManager implements Module
         return prevConfig;
     }
 
+    private void removeInterfaceConfig(AbstractInterfaceConfig config) {
+        String uniqueServiceName;
+        Map<String, AbstractInterfaceConfig> configCache;
+        if (config instanceof ReferenceConfigBase) {
+            return;
+        } else if (config instanceof ServiceConfigBase) {
+            ServiceConfigBase serviceConfig = (ServiceConfigBase) config;
+            uniqueServiceName = serviceConfig.getUniqueServiceName();
+            configCache = serviceConfigCache;
+        } else {
+            throw new IllegalArgumentException("Illegal type of parameter 
'config' : " + config.getClass().getName());
+        }
+        configCache.remove(uniqueServiceName, config);
+    }
+
     @Override
     public void loadConfigs() {
         // load dubbo.providers.xxx

Reply via email to