From b7ddcac33a188eaeed413551143253bad1449b96 Mon Sep 17 00:00:00 2001 From: "ken.lj" Date: Wed, 21 Jul 2021 16:32:46 +0800 Subject: [PATCH 1/3] backport #7322 --- .../dubbo/rpc/protocol/dubbo/LazyConnectExchangeClient.java | 2 +- .../rpc/protocol/dubbo/ReferenceCountExchangeClient.java | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/com/alibaba/dubbo/rpc/protocol/dubbo/LazyConnectExchangeClient.java b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/com/alibaba/dubbo/rpc/protocol/dubbo/LazyConnectExchangeClient.java index 235af3986d4..ef4dd92124d 100644 --- a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/com/alibaba/dubbo/rpc/protocol/dubbo/LazyConnectExchangeClient.java +++ b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/com/alibaba/dubbo/rpc/protocol/dubbo/LazyConnectExchangeClient.java @@ -115,7 +115,7 @@ public ResponseFuture request(Object request, int timeout) throws RemotingExcept private void warning(Object request) { if (requestWithWarning) { if (warningcount.get() % 5000 == 0) { - logger.warn(new IllegalStateException("safe guard client , should not be called ,must have a bug.")); + logger.warn(url.getAddress() + " " + url.getServiceKey() + "safe guard client , should not be called ,must have a bug."); } warningcount.incrementAndGet(); } diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/com/alibaba/dubbo/rpc/protocol/dubbo/ReferenceCountExchangeClient.java b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/com/alibaba/dubbo/rpc/protocol/dubbo/ReferenceCountExchangeClient.java index 4a6e96593d0..783e90dafa0 100644 --- a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/com/alibaba/dubbo/rpc/protocol/dubbo/ReferenceCountExchangeClient.java +++ b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/com/alibaba/dubbo/rpc/protocol/dubbo/ReferenceCountExchangeClient.java @@ -167,11 +167,7 @@ public void startClose() { private LazyConnectExchangeClient replaceWithLazyClient() { // this is a defensive operation to avoid client is closed by accident, the initial state of the client is false URL lazyUrl = url.addParameter(Constants.LAZY_CONNECT_INITIAL_STATE_KEY, Boolean.TRUE) - .addParameter(Constants.RECONNECT_KEY, Boolean.FALSE) - .addParameter(Constants.SEND_RECONNECT_KEY, Boolean.TRUE.toString()) - .addParameter("warning", Boolean.TRUE.toString()) - .addParameter(LazyConnectExchangeClient.REQUEST_WITH_WARNING_KEY, true) - .addParameter("_client_memo", "referencecounthandler.replacewithlazyclient"); + .addParameter(Constants.SEND_RECONNECT_KEY, Boolean.TRUE.toString()); String key = url.getAddress(); // in worst case there's only one ghost connection. From 7534b83a1093e77a060998941f00702a11c284c6 Mon Sep 17 00:00:00 2001 From: "ken.lj" Date: Thu, 22 Jul 2021 20:37:30 +0800 Subject: [PATCH 2/3] destroy invoker before client --- .../com/alibaba/dubbo/rpc/protocol/dubbo/DubboProtocol.java | 4 +++- .../dubbo/rpc/protocol/dubbo/LazyConnectExchangeClient.java | 2 +- .../rpc/protocol/dubbo/ReferenceCountExchangeClient.java | 4 +++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/com/alibaba/dubbo/rpc/protocol/dubbo/DubboProtocol.java b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/com/alibaba/dubbo/rpc/protocol/dubbo/DubboProtocol.java index 017e4a93df3..262ab701876 100644 --- a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/com/alibaba/dubbo/rpc/protocol/dubbo/DubboProtocol.java +++ b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/com/alibaba/dubbo/rpc/protocol/dubbo/DubboProtocol.java @@ -437,6 +437,9 @@ public void destroy() { } } } + // put here to reduce the chance of accepting new invocation after client closed. + // close invoker and then client. + super.destroy(); for (String key : new ArrayList(referenceClientMap.keySet())) { ExchangeClient client = referenceClientMap.remove(key); @@ -466,6 +469,5 @@ public void destroy() { } } stubServiceMethodsMap.clear(); - super.destroy(); } } diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/com/alibaba/dubbo/rpc/protocol/dubbo/LazyConnectExchangeClient.java b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/com/alibaba/dubbo/rpc/protocol/dubbo/LazyConnectExchangeClient.java index ef4dd92124d..c5a1307e360 100644 --- a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/com/alibaba/dubbo/rpc/protocol/dubbo/LazyConnectExchangeClient.java +++ b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/com/alibaba/dubbo/rpc/protocol/dubbo/LazyConnectExchangeClient.java @@ -115,7 +115,7 @@ public ResponseFuture request(Object request, int timeout) throws RemotingExcept private void warning(Object request) { if (requestWithWarning) { if (warningcount.get() % 5000 == 0) { - logger.warn(url.getAddress() + " " + url.getServiceKey() + "safe guard client , should not be called ,must have a bug."); + logger.warn(url.getAddress() + " " + url.getServiceKey() + " safeguard client get called after real client closed, recreating connection..."); } warningcount.incrementAndGet(); } diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/com/alibaba/dubbo/rpc/protocol/dubbo/ReferenceCountExchangeClient.java b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/com/alibaba/dubbo/rpc/protocol/dubbo/ReferenceCountExchangeClient.java index 783e90dafa0..caed5008ef5 100644 --- a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/com/alibaba/dubbo/rpc/protocol/dubbo/ReferenceCountExchangeClient.java +++ b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/com/alibaba/dubbo/rpc/protocol/dubbo/ReferenceCountExchangeClient.java @@ -167,7 +167,9 @@ public void startClose() { private LazyConnectExchangeClient replaceWithLazyClient() { // this is a defensive operation to avoid client is closed by accident, the initial state of the client is false URL lazyUrl = url.addParameter(Constants.LAZY_CONNECT_INITIAL_STATE_KEY, Boolean.TRUE) - .addParameter(Constants.SEND_RECONNECT_KEY, Boolean.TRUE.toString()); + .addParameter(Constants.SEND_RECONNECT_KEY, Boolean.TRUE.toString()) + .addParameter(LazyConnectExchangeClient.REQUEST_WITH_WARNING_KEY, true); + String key = url.getAddress(); // in worst case there's only one ghost connection. From 489f729b5e15fc62ac5fef540a9b5f1995f0bce7 Mon Sep 17 00:00:00 2001 From: "ken.lj" Date: Fri, 23 Jul 2021 10:24:44 +0800 Subject: [PATCH 3/3] fix log does not match --- .../dubbo/rpc/protocol/dubbo/LazyConnectExchangeClient.java | 2 +- .../rpc/protocol/dubbo/ReferenceCountExchangeClientTest.java | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/com/alibaba/dubbo/rpc/protocol/dubbo/LazyConnectExchangeClient.java b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/com/alibaba/dubbo/rpc/protocol/dubbo/LazyConnectExchangeClient.java index c5a1307e360..bc230a26dbf 100644 --- a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/com/alibaba/dubbo/rpc/protocol/dubbo/LazyConnectExchangeClient.java +++ b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/com/alibaba/dubbo/rpc/protocol/dubbo/LazyConnectExchangeClient.java @@ -115,7 +115,7 @@ public ResponseFuture request(Object request, int timeout) throws RemotingExcept private void warning(Object request) { if (requestWithWarning) { if (warningcount.get() % 5000 == 0) { - logger.warn(url.getAddress() + " " + url.getServiceKey() + " safeguard client get called after real client closed, recreating connection..."); + logger.warn(url.getAddress() + " " + url.getServiceKey() + " safe guard client get called after real client closed, recreating connection..."); } warningcount.incrementAndGet(); } diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/com/alibaba/dubbo/rpc/protocol/dubbo/ReferenceCountExchangeClientTest.java b/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/com/alibaba/dubbo/rpc/protocol/dubbo/ReferenceCountExchangeClientTest.java index d9b64c2fa3b..452e6a919e1 100644 --- a/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/com/alibaba/dubbo/rpc/protocol/dubbo/ReferenceCountExchangeClientTest.java +++ b/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/com/alibaba/dubbo/rpc/protocol/dubbo/ReferenceCountExchangeClientTest.java @@ -26,7 +26,6 @@ import com.alibaba.dubbo.rpc.Exporter; import com.alibaba.dubbo.rpc.Invoker; import com.alibaba.dubbo.rpc.ProxyFactory; - import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; @@ -46,7 +45,7 @@ public class ReferenceCountExchangeClientTest { IHelloService helloService; ExchangeClient demoClient; ExchangeClient helloClient; - String errorMsg = "safe guard client , should not be called ,must have a bug"; + String errorMsg = "safe guard client"; @BeforeClass public static void setUpBeforeClass() throws Exception {