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());