You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by al...@apache.org on 2021/08/23 05:17:05 UTC

[dubbo] branch 2.6.x updated: Dubbo ProviderConsumerRegTable class cause outOfMemory while no provider available exception occurs (#8522)

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

albumenj pushed a commit to branch 2.6.x
in repository https://gitbox.apache.org/repos/asf/dubbo.git


The following commit(s) were added to refs/heads/2.6.x by this push:
     new f62ca3f  Dubbo ProviderConsumerRegTable class cause outOfMemory while no provider available exception occurs (#8522)
f62ca3f is described below

commit f62ca3f71a6db624cd4e3b23a58ed7dacf736d91
Author: qixiaobo <qi...@gmail.com>
AuthorDate: Mon Aug 23 13:15:20 2021 +0800

    Dubbo ProviderConsumerRegTable class cause outOfMemory while no provider available exception occurs (#8522)
    
    since create proxy error , so we must be the first consumer. Simply clear ConcurrentHashSet
---
 .../main/java/com/alibaba/dubbo/config/ReferenceConfig.java | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/ReferenceConfig.java b/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/ReferenceConfig.java
index 8be61c5..47ecfee 100644
--- a/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/ReferenceConfig.java
+++ b/dubbo-config/dubbo-config-api/src/main/java/com/alibaba/dubbo/config/ReferenceConfig.java
@@ -29,6 +29,8 @@ import com.alibaba.dubbo.config.annotation.Reference;
 import com.alibaba.dubbo.config.model.ApplicationModel;
 import com.alibaba.dubbo.config.model.ConsumerModel;
 import com.alibaba.dubbo.config.support.Parameter;
+import com.alibaba.dubbo.registry.support.ConsumerInvokerWrapper;
+import com.alibaba.dubbo.registry.support.ProviderConsumerRegTable;
 import com.alibaba.dubbo.rpc.Invoker;
 import com.alibaba.dubbo.rpc.Protocol;
 import com.alibaba.dubbo.rpc.ProxyFactory;
@@ -47,11 +49,13 @@ import java.io.IOException;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
+import java.util.Set;
 
 import static com.alibaba.dubbo.common.utils.NetUtils.isInvalidLocalHost;
 
@@ -423,7 +427,14 @@ public class ReferenceConfig<T> extends AbstractReferenceConfig {
         if (c && !invoker.isAvailable()) {
             // make it possible for consumer to retry later if provider is temporarily unavailable
             initialized = false;
-            throw new IllegalStateException("Failed to check the status of the service " + interfaceName + ". No provider available for the service " + (group == null ? "" : group + "/") + interfaceName + (version == null ? "" : ":" + version) + " from the url " + invoker.getUrl() + " to the consumer " + NetUtils.getLocalHost() + " use dubbo version " + Version.getVersion());
+            final String serviceKey = (group == null ? "" : group + "/") + interfaceName + (version == null ? "" :
+                    ":" + version);
+            Set<ConsumerInvokerWrapper> consumerInvoker = ProviderConsumerRegTable.getConsumerInvoker(serviceKey);
+            if (consumerInvoker != Collections.<ConsumerInvokerWrapper>emptySet()) {
+                //since create proxy error , so we must be the first consumer. Simply clear ConcurrentHashSet
+                consumerInvoker.clear();
+            }
+            throw new IllegalStateException("Failed to check the status of the service " + interfaceName + ". No provider available for the service " + serviceKey + " from the url " + invoker.getUrl() + " to the consumer " + NetUtils.getLocalHost() + " use dubbo version " + Version.getVersion());
         }
         if (logger.isInfoEnabled()) {
             logger.info("Refer dubbo service " + interfaceClass.getName() + " from url " + invoker.getUrl());