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