You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by li...@apache.org on 2022/04/21 08:06:50 UTC

[dubbo] 01/01: fix

This is an automated email from the ASF dual-hosted git repository.

liujun pushed a commit to branch fix-mapping-init
in repository https://gitbox.apache.org/repos/asf/dubbo.git

commit 5f36cfe44f2581a396fc9da56ad66f4f2d59ad27
Author: chickenlj <ke...@gmail.com>
AuthorDate: Thu Apr 21 15:56:17 2022 +0800

    fix
---
 .../dubbo/metadata/AbstractServiceNameMapping.java | 31 ++++++++++++++--------
 1 file changed, 20 insertions(+), 11 deletions(-)

diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/AbstractServiceNameMapping.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/AbstractServiceNameMapping.java
index 66a77ca35d..1126af097e 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/AbstractServiceNameMapping.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/AbstractServiceNameMapping.java
@@ -25,11 +25,7 @@ import org.apache.dubbo.common.utils.StringUtils;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.model.ScopeModelAware;
 
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeSet;
+import java.util.*;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
@@ -54,7 +50,7 @@ public abstract class AbstractServiceNameMapping implements ServiceNameMapping,
     private final Map<String, Set<MappingListener>> mappingListeners = new ConcurrentHashMap<>();
     // mapping lock is shared among registries of the same application.
     private final ConcurrentMap<String, ReentrantLock> mappingLocks = new ConcurrentHashMap<>();
-    private volatile boolean initiated;
+    private final Map<String, Boolean> mappingInitiated = new HashMap<>();
 
     public AbstractServiceNameMapping(ApplicationModel applicationModel) {
         this.applicationModel = applicationModel;
@@ -86,12 +82,10 @@ public abstract class AbstractServiceNameMapping implements ServiceNameMapping,
 
     @Override
     public synchronized void initInterfaceAppMapping(URL subscribedURL) {
-        if (initiated) {
-            return;
-        }
-        initiated = true;
-        Set<String> subscribedServices = new TreeSet<>();
         String key = ServiceNameMapping.buildMappingKey(subscribedURL);
+        if (hasInitiated(key)) return;
+
+        Set<String> subscribedServices = new TreeSet<>();
         String serviceNames = subscribedURL.getParameter(PROVIDED_BY);
 
         if (StringUtils.isNotEmpty(serviceNames)) {
@@ -224,6 +218,21 @@ public abstract class AbstractServiceNameMapping implements ServiceNameMapping,
         }
     }
 
+    private boolean hasInitiated(String key) {
+        Lock lock = getMappingLock(key);
+        try {
+            lock.lock();
+            boolean initiated = mappingInitiated.computeIfAbsent(key, _k -> Boolean.FALSE);
+            if (initiated) {
+                return true;
+            }
+            mappingInitiated.put(key, Boolean.TRUE);
+        } finally {
+            lock.unlock();
+        }
+        return false;
+    }
+
     @Override
     public void $destroy() {
         mappingCacheManager.destroy();