This is an automated email from the ASF dual-hosted git repository.
albumenj pushed a commit to branch 3.2
in repository https://gitbox.apache.org/repos/asf/dubbo.git
The following commit(s) were added to refs/heads/3.2 by this push:
new 5d76667808 Clear future in RpcContext when calling sync (#12493)
(#12534)
5d76667808 is described below
commit 5d76667808720eec49d6d970a57145142b228634
Author: yuzang <[email protected]>
AuthorDate: Fri Jun 30 20:33:17 2023 +0800
Clear future in RpcContext when calling sync (#12493) (#12534)
* Clear future in RpcContext when calling sync (#12493)
* skip set futureContext in sync situation
* fix
* add setFutureWhenSync
---------
Co-authored-by: 解立强 <[email protected]>
Co-authored-by: Albumen Kevin <[email protected]>
---
.../java/org/apache/dubbo/rpc/protocol/dubbo/DubboInvoker.java | 8 +++++++-
.../java/org/apache/dubbo/rpc/protocol/injvm/InjvmInvoker.java | 6 +++++-
.../java/org/apache/dubbo/rpc/protocol/tri/TripleInvoker.java | 6 +++++-
3 files changed, 17 insertions(+), 3 deletions(-)
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 9dfb716e75..06466c6938 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
@@ -19,6 +19,7 @@ package org.apache.dubbo.rpc.protocol.dubbo;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.Version;
import org.apache.dubbo.common.config.ConfigurationUtils;
+import org.apache.dubbo.common.constants.CommonConstants;
import org.apache.dubbo.common.serialize.SerializationException;
import org.apache.dubbo.common.utils.AtomicPositiveInteger;
import org.apache.dubbo.remoting.Constants;
@@ -30,6 +31,7 @@ import org.apache.dubbo.rpc.AppResponse;
import org.apache.dubbo.rpc.AsyncRpcResult;
import org.apache.dubbo.rpc.FutureContext;
import org.apache.dubbo.rpc.Invocation;
+import org.apache.dubbo.rpc.InvokeMode;
import org.apache.dubbo.rpc.Invoker;
import org.apache.dubbo.rpc.Result;
import org.apache.dubbo.rpc.RpcContext;
@@ -70,6 +72,8 @@ public class DubboInvoker<T> extends AbstractInvoker<T> {
private final int serverShutdownTimeout;
+ private static final boolean setFutureWhenSync =
Boolean.parseBoolean(System.getProperty(CommonConstants.SET_FUTURE_IN_SYNC_MODE,
"true"));
+
public DubboInvoker(Class<T> serviceType, URL url, ClientsProvider
clientsProvider) {
this(serviceType, url, clientsProvider, null);
}
@@ -129,7 +133,9 @@ public class DubboInvoker<T> extends AbstractInvoker<T> {
CompletableFuture<AppResponse> appResponseFuture =
currentClient.request(request, timeout,
executor).thenApply(AppResponse.class::cast);
// save for 2.6.x compatibility, for example, TraceFilter in
Zipkin uses com.alibaba.xxx.FutureAdapter
-
FutureContext.getContext().setCompatibleFuture(appResponseFuture);
+ if (setFutureWhenSync || ((RpcInvocation)
invocation).getInvokeMode() != InvokeMode.SYNC) {
+
FutureContext.getContext().setCompatibleFuture(appResponseFuture);
+ }
AsyncRpcResult result = new AsyncRpcResult(appResponseFuture,
inv);
result.setExecutor(executor);
return result;
diff --git
a/dubbo-rpc/dubbo-rpc-injvm/src/main/java/org/apache/dubbo/rpc/protocol/injvm/InjvmInvoker.java
b/dubbo-rpc/dubbo-rpc-injvm/src/main/java/org/apache/dubbo/rpc/protocol/injvm/InjvmInvoker.java
index 70cf0b3534..ea28e91090 100644
---
a/dubbo-rpc/dubbo-rpc-injvm/src/main/java/org/apache/dubbo/rpc/protocol/injvm/InjvmInvoker.java
+++
b/dubbo-rpc/dubbo-rpc-injvm/src/main/java/org/apache/dubbo/rpc/protocol/injvm/InjvmInvoker.java
@@ -68,6 +68,8 @@ public class InjvmInvoker<T> extends AbstractInvoker<T> {
private final boolean shouldIgnoreSameModule;
+ private static final boolean setFutureWhenSync =
Boolean.parseBoolean(System.getProperty(CommonConstants.SET_FUTURE_IN_SYNC_MODE,
"true"));
+
InjvmInvoker(Class<T> type, URL url, String key, Map<String, Exporter<?>>
exporterMap) {
super(type, url);
this.key = key;
@@ -142,7 +144,9 @@ public class InjvmInvoker<T> extends AbstractInvoker<T> {
}
}, executor);
// save for 2.6.x compatibility, for example, TraceFilter in
Zipkin uses com.alibaba.xxx.FutureAdapter
- FutureContext.getContext().setCompatibleFuture(appResponseFuture);
+ if (setFutureWhenSync || ((RpcInvocation)
invocation).getInvokeMode() != InvokeMode.SYNC) {
+
FutureContext.getContext().setCompatibleFuture(appResponseFuture);
+ }
AsyncRpcResult result = new AsyncRpcResult(appResponseFuture,
copiedInvocation);
result.setExecutor(executor);
return result;
diff --git
a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/TripleInvoker.java
b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/TripleInvoker.java
index cda6a57c22..0e18df346e 100644
---
a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/TripleInvoker.java
+++
b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/TripleInvoker.java
@@ -92,6 +92,8 @@ public class TripleInvoker<T> extends AbstractInvoker<T> {
private final String acceptEncodings;
private final TripleWriteQueue writeQueue = new TripleWriteQueue(256);
+ private static final boolean setFutureWhenSync =
Boolean.parseBoolean(System.getProperty(CommonConstants.SET_FUTURE_IN_SYNC_MODE,
"true"));
+
public TripleInvoker(Class<T> serviceType,
URL url,
String acceptEncodings,
@@ -241,7 +243,9 @@ public class TripleInvoker<T> extends AbstractInvoker<T> {
pureArgument = invocation.getArguments();
}
result = new AsyncRpcResult(future, invocation);
- FutureContext.getContext().setCompatibleFuture(future);
+ if (setFutureWhenSync || ((RpcInvocation) invocation).getInvokeMode()
!= InvokeMode.SYNC) {
+ FutureContext.getContext().setCompatibleFuture(future);
+ }
result.setExecutor(callbackExecutor);
ClientCall.Listener callListener = new UnaryClientCallListener(future);