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 <[email protected]> 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();
