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/09/12 12:09:36 UTC

[dubbo] branch master updated: close client immediately when destroy unused invoker (#8756)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 55dec92  close client immediately when destroy unused invoker (#8756)
55dec92 is described below

commit 55dec926bbe325b6b78b16d6db761a268b0d00ac
Author: zrlw <zr...@sina.com>
AuthorDate: Sun Sep 12 20:09:24 2021 +0800

    close client immediately when destroy unused invoker (#8756)
---
 .../client/ServiceDiscoveryRegistryDirectory.java    |  4 ++--
 .../registry/integration/RegistryDirectory.java      |  4 ++--
 .../dubbo/remoting/exchange/ExchangeClient.java      |  4 ++++
 .../src/main/java/org/apache/dubbo/rpc/Invoker.java  |  7 +++++++
 .../dubbo/rpc/protocol/dubbo/DubboInvoker.java       | 20 +++++++++++++++++++-
 .../protocol/dubbo/ReferenceCountExchangeClient.java | 17 ++++++++++++++++-
 6 files changed, 50 insertions(+), 6 deletions(-)

diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistryDirectory.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistryDirectory.java
index 9051b2b..00f05b7 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistryDirectory.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistryDirectory.java
@@ -317,7 +317,7 @@ public class ServiceDiscoveryRegistryDirectory<T> extends DynamicDirectory<T> {
         if (localUrlInvokerMap != null) {
             for (Invoker<T> invoker : new ArrayList<>(localUrlInvokerMap.values())) {
                 try {
-                    invoker.destroy();
+                    invoker.destroyAll();
                 } catch (Throwable t) {
                     logger.warn("Failed to destroy service " + serviceKey + " to provider " + invoker.getUrl(), t);
                 }
@@ -359,7 +359,7 @@ public class ServiceDiscoveryRegistryDirectory<T> extends DynamicDirectory<T> {
                     Invoker<T> invoker = oldUrlInvokerMap.remove(addressKey);
                     if (invoker != null) {
                         try {
-                            invoker.destroy();
+                            invoker.destroyAll();
                             if (logger.isDebugEnabled()) {
                                 logger.debug("destroy invoker[" + invoker.getUrl() + "] success. ");
                             }
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryDirectory.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryDirectory.java
index 6e2ab5a..5292e8c 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryDirectory.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryDirectory.java
@@ -409,7 +409,7 @@ public class RegistryDirectory<T> extends DynamicDirectory<T> {
         if (localUrlInvokerMap != null) {
             for (Invoker<T> invoker : new ArrayList<>(localUrlInvokerMap.values())) {
                 try {
-                    invoker.destroy();
+                    invoker.destroyAll();
                 } catch (Throwable t) {
                     logger.warn("Failed to destroy service " + serviceKey + " to provider " + invoker.getUrl(), t);
                 }
@@ -439,7 +439,7 @@ public class RegistryDirectory<T> extends DynamicDirectory<T> {
                     Invoker<T> invoker = oldUrlInvokerMap.get(key);
                     if (invoker != null) {
                         try {
-                            invoker.destroy();
+                            invoker.destroyAll();
                             if (logger.isDebugEnabled()) {
                                 logger.debug("destroy invoker[" + invoker.getUrl() + "] success. ");
                             }
diff --git a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/ExchangeClient.java b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/ExchangeClient.java
index 89846cb..57d74dc 100644
--- a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/ExchangeClient.java
+++ b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/ExchangeClient.java
@@ -25,4 +25,8 @@ import org.apache.dubbo.remoting.Client;
  */
 public interface ExchangeClient extends Client, ExchangeChannel {
 
+    default void closeAll(int timeout) {
+        close(timeout);
+    }
+
 }
\ No newline at end of file
diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/Invoker.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/Invoker.java
index 04186fa..823ad11 100644
--- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/Invoker.java
+++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/Invoker.java
@@ -43,4 +43,11 @@ public interface Invoker<T> extends Node {
      */
     Result invoke(Invocation invocation) throws RpcException;
 
+    /**
+     * destroy all
+     */
+    default void destroyAll() {
+        destroy();
+    }
+
 }
\ No newline at end of file
diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DubboInvoker.java b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DubboInvoker.java
index c4c9474..6d17f63 100644
--- a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DubboInvoker.java
+++ b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DubboInvoker.java
@@ -135,6 +135,20 @@ public class DubboInvoker<T> extends AbstractInvoker<T> {
 
     @Override
     public void destroy() {
+        destroyInternal(false);
+    }
+
+    @Override
+    public void destroyAll() {
+        destroyInternal(true);
+    }
+
+    /**
+     * when destroy unused invoker, closeAll should be true
+     *
+     * @param closeAll
+     */
+    private void destroyInternal(boolean closeAll) {
         // in order to avoid closing a client multiple times, a counter is used in case of connection per jvm, every
         // time when client.close() is called, counter counts down once, and when counter reaches zero, client will be
         // closed.
@@ -153,7 +167,11 @@ public class DubboInvoker<T> extends AbstractInvoker<T> {
                 }
                 for (ExchangeClient client : clients) {
                     try {
-                        client.close(ConfigurationUtils.getServerShutdownTimeout());
+                        if (closeAll) {
+                            client.closeAll(ConfigurationUtils.getServerShutdownTimeout());
+                        } else {
+                            client.close(ConfigurationUtils.getServerShutdownTimeout());
+                        }
                     } catch (Throwable t) {
                         logger.warn(t.getMessage(), t);
                     }
diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/ReferenceCountExchangeClient.java b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/ReferenceCountExchangeClient.java
index 98e079f..80c4c99 100644
--- a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/ReferenceCountExchangeClient.java
+++ b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/ReferenceCountExchangeClient.java
@@ -158,7 +158,22 @@ final class ReferenceCountExchangeClient implements ExchangeClient {
 
     @Override
     public void close(int timeout) {
-        if (referenceCount.decrementAndGet() <= 0) {
+        closeInternal(timeout, false);
+    }
+
+    @Override
+    public void closeAll(int timeout) {
+        closeInternal(timeout, true);
+    }
+
+    /**
+     * when destroy unused invoker, closeAll should be true
+     *
+     * @param timeout
+     * @param closeAll
+     */
+    private void closeInternal(int timeout, boolean closeAll) {
+        if (closeAll || referenceCount.decrementAndGet() <= 0) {
             if (timeout == 0) {
                 client.close();