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:06 UTC
[dubbo] branch 3.0 updated: [3.0] close client immediately when
destroy unused invoker (#8755)
This is an automated email from the ASF dual-hosted git repository.
albumenj 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 d5f44c2 [3.0] close client immediately when destroy unused invoker (#8755)
d5f44c2 is described below
commit d5f44c256a4a22699cbd49db41aaf18a99fc4dc8
Author: zrlw <zr...@sina.com>
AuthorDate: Sun Sep 12 20:08:54 2021 +0800
[3.0] close client immediately when destroy unused invoker (#8755)
* close client immediately when destroy unused invoker
* fix condition statement
* call invoke.destroyAll() when destroy all invokers
* format code
---
.../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 e5ea6d8..45f3e78 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
@@ -369,7 +369,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);
}
@@ -402,7 +402,7 @@ public class ServiceDiscoveryRegistryDirectory<T> extends DynamicDirectory<T> {
Invoker<T> invoker = entry.getValue();
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 92d0880..a849a4f 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
@@ -465,7 +465,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);
}
@@ -490,7 +490,7 @@ public class RegistryDirectory<T> extends DynamicDirectory<T> {
Invoker<T> invoker = entry.getValue();
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 8ce3fac..2fdf6a6 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);
+ }
+
}
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 6bf3a3a..bf6a654 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();
+ }
+
}
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 a63f56f..67e3f11 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
@@ -138,6 +138,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.
@@ -154,7 +168,11 @@ public class DubboInvoker<T> extends AbstractInvoker<T> {
}
for (ExchangeClient client : clients) {
try {
- client.close(serverShutdownTimeout);
+ if (closeAll) {
+ client.closeAll(serverShutdownTimeout);
+ } else {
+ client.close(serverShutdownTimeout);
+ }
} 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 a3b9128..53ea913 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();