You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by li...@apache.org on 2021/11/25 06:20:24 UTC
[dubbo] 38/45: fix: 修复 rpc context 覆盖 attachment 属性的问题
This is an automated email from the ASF dual-hosted git repository.
liujun pushed a commit to branch release/3.0.14-rpccontext-bugfix
in repository https://gitbox.apache.org/repos/asf/dubbo.git
commit 8ac9cb0b12d373b3656fc1fe55c7ddb2151af82b
Author: 未宇 <li...@alibaba-inc.com>
AuthorDate: Mon Jan 18 16:38:45 2021 +0800
fix: 修复 rpc context 覆盖 attachment 属性的问题
---
.../org/apache/dubbo/rpc/filter/ConsumerContextFilter.java | 14 ++++++++++++++
.../org/apache/dubbo/rpc/protocol/AbstractInvoker.java | 11 -----------
2 files changed, 14 insertions(+), 11 deletions(-)
diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/ConsumerContextFilter.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/ConsumerContextFilter.java
index 5aad186..f7bc3d6 100644
--- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/ConsumerContextFilter.java
+++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/ConsumerContextFilter.java
@@ -17,6 +17,7 @@
package org.apache.dubbo.rpc.filter;
import org.apache.dubbo.common.extension.Activate;
+import org.apache.dubbo.common.utils.CollectionUtils;
import org.apache.dubbo.common.utils.NetUtils;
import org.apache.dubbo.rpc.AsyncRpcResult;
import org.apache.dubbo.rpc.Filter;
@@ -28,6 +29,8 @@ import org.apache.dubbo.rpc.RpcException;
import org.apache.dubbo.rpc.RpcInvocation;
import org.apache.dubbo.rpc.TimeoutCountDown;
+import java.util.Map;
+
import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY;
import static org.apache.dubbo.common.constants.CommonConstants.CONSUMER;
import static org.apache.dubbo.common.constants.CommonConstants.REMOTE_APPLICATION_KEY;
@@ -56,6 +59,17 @@ public class ConsumerContextFilter implements Filter {
((RpcInvocation) invocation).setInvoker(invoker);
}
+ Map<String, Object> contextAttachments = RpcContext.getContext().getObjectAttachments();
+ if (CollectionUtils.isNotEmptyMap(contextAttachments)) {
+ /**
+ * invocation.addAttachmentsIfAbsent(context){@link RpcInvocation#addAttachmentsIfAbsent(Map)}should not be used here,
+ * because the {@link RpcContext#setAttachment(String, String)} is passed in the Filter when the call is triggered
+ * by the built-in retry mechanism of the Dubbo. The attachment to update RpcContext will no longer work, which is
+ * a mistake in most cases (for example, through Filter to RpcContext output traceId and spanId and other information).
+ */
+ ((RpcInvocation) invocation).addObjectAttachments(contextAttachments);
+ }
+
// pass default timeout set by end user (ReferenceConfig)
Object countDown = context.get(TIME_COUNTDOWN_KEY);
if (countDown != null) {
diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/protocol/AbstractInvoker.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/protocol/AbstractInvoker.java
index 90e101d..1d0084d 100644
--- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/protocol/AbstractInvoker.java
+++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/protocol/AbstractInvoker.java
@@ -144,17 +144,6 @@ public abstract class AbstractInvoker<T> implements Invoker<T> {
invocation.addObjectAttachmentsIfAbsent(attachment);
}
- Map<String, Object> contextAttachments = RpcContext.getContext().getObjectAttachments();
- if (CollectionUtils.isNotEmptyMap(contextAttachments)) {
- /**
- * invocation.addAttachmentsIfAbsent(context){@link RpcInvocation#addAttachmentsIfAbsent(Map)}should not be used here,
- * because the {@link RpcContext#setAttachment(String, String)} is passed in the Filter when the call is triggered
- * by the built-in retry mechanism of the Dubbo. The attachment to update RpcContext will no longer work, which is
- * a mistake in most cases (for example, through Filter to RpcContext output traceId and spanId and other information).
- */
- invocation.addObjectAttachments(contextAttachments);
- }
-
invocation.setInvokeMode(RpcUtils.getInvokeMode(url, invocation));
RpcUtils.attachInvocationIdIfAsync(getUrl(), invocation);