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

Reply via email to