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/06/13 02:32:03 UTC

[dubbo] branch 3.0 updated: fix #10044, sharing proxy instance with references

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

liujun 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 d9bdafdf94 fix #10044, sharing proxy instance with references
d9bdafdf94 is described below

commit d9bdafdf948aba8f7ac5a32c60e19327185e3bd2
Author: Wang Chengming <63...@qq.com>
AuthorDate: Mon Jun 13 10:31:56 2022 +0800

    fix #10044, sharing proxy instance with references
    
    Co-authored-by: 呈铭 <be...@antgroup.com>
---
 .../config/utils/CompositeReferenceCache.java      | 25 ++++++++++++++++++++--
 1 file changed, 23 insertions(+), 2 deletions(-)

diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/utils/CompositeReferenceCache.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/utils/CompositeReferenceCache.java
index 827dca215a..e40c2a792b 100644
--- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/utils/CompositeReferenceCache.java
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/utils/CompositeReferenceCache.java
@@ -16,7 +16,10 @@
  */
 package org.apache.dubbo.config.utils;
 
+import org.apache.dubbo.common.BaseServiceMetadata;
 import org.apache.dubbo.common.config.ReferenceCache;
+import org.apache.dubbo.common.logger.Logger;
+import org.apache.dubbo.common.logger.LoggerFactory;
 import org.apache.dubbo.config.ReferenceConfigBase;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.model.ModuleModel;
@@ -28,7 +31,10 @@ import java.util.List;
  * A impl of ReferenceCache for Application
  */
 public class CompositeReferenceCache implements ReferenceCache {
-    private ApplicationModel applicationModel;
+
+    private static final Logger logger = LoggerFactory.getLogger(CompositeReferenceCache.class);
+
+    private final ApplicationModel applicationModel;
 
     public CompositeReferenceCache(ApplicationModel applicationModel) {
         this.applicationModel = applicationModel;
@@ -36,7 +42,22 @@ public class CompositeReferenceCache implements ReferenceCache {
 
     @Override
     public <T> T get(ReferenceConfigBase<T> referenceConfig) {
-        return referenceConfig.get();
+
+        Class<?> type = referenceConfig.getInterfaceClass();
+        String key = BaseServiceMetadata.buildServiceKey(type.getName(), referenceConfig.getGroup(), referenceConfig.getVersion());
+
+        boolean singleton = referenceConfig.getSingleton() == null || referenceConfig.getSingleton();
+        T proxy = null;
+        if (singleton) {
+            proxy = get(key, (Class<T>) type);
+        } else {
+            logger.warn("Using non-singleton ReferenceConfig and ReferenceCache at the same time may cause memory leak. " +
+                "Call ReferenceConfig#get() directly for non-singleton ReferenceConfig instead of using ReferenceCache#get(ReferenceConfig)");
+        }
+        if (proxy == null) {
+            proxy = referenceConfig.get();
+        }
+        return proxy;
     }
 
     @Override