From a47f1ef60e24b82a44621b29b82d5e052a8db9e5 Mon Sep 17 00:00:00 2001 From: yuz10 <845238369@qq.com> Date: Wed, 8 Dec 2021 15:07:31 +0800 Subject: [PATCH] [Issue #3394] fix duplicate keys in trace message (#3395) --- .../client/trace/TraceDataEncoder.java | 5 ++- .../client/trace/TraceDataEncoderTest.java | 33 ++++++++++++++++++- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/TraceDataEncoder.java b/client/src/main/java/org/apache/rocketmq/client/trace/TraceDataEncoder.java index b4a49a0564..f0c685e0a6 100644 --- a/client/src/main/java/org/apache/rocketmq/client/trace/TraceDataEncoder.java +++ b/client/src/main/java/org/apache/rocketmq/client/trace/TraceDataEncoder.java @@ -17,9 +17,11 @@ package org.apache.rocketmq.client.trace; import org.apache.rocketmq.client.producer.LocalTransactionState; +import org.apache.rocketmq.common.message.MessageConst; import org.apache.rocketmq.common.message.MessageType; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; /** @@ -218,7 +220,8 @@ public class TraceDataEncoder { transferBean.getTransKey().add(bean.getMsgId()); if (bean.getKeys() != null && bean.getKeys().length() > 0) { - transferBean.getTransKey().add(bean.getKeys()); + String[] keys = bean.getKeys().split(MessageConst.KEY_SEPARATOR); + transferBean.getTransKey().addAll(Arrays.asList(keys)); } } return transferBean; diff --git a/client/src/test/java/org/apache/rocketmq/client/trace/TraceDataEncoderTest.java b/client/src/test/java/org/apache/rocketmq/client/trace/TraceDataEncoderTest.java index 03381d01ff..fed8c4ef76 100644 --- a/client/src/test/java/org/apache/rocketmq/client/trace/TraceDataEncoderTest.java +++ b/client/src/test/java/org/apache/rocketmq/client/trace/TraceDataEncoderTest.java @@ -25,6 +25,9 @@ import org.junit.Test; import java.util.ArrayList; import java.util.List; +import java.util.Set; + +import static org.assertj.core.api.Assertions.assertThat; public class TraceDataEncoderTest { @@ -129,7 +132,7 @@ public class TraceDataEncoderTest { Assert.assertEquals(before.getTransactionState(), after.getTransactionState()); Assert.assertEquals(before.isFromTransactionCheck(), after.isFromTransactionCheck()); } - + @Test public void testPubTraceDataFormatTest() { TraceContext pubContext = new TraceContext(); @@ -234,4 +237,32 @@ public class TraceDataEncoderTest { Assert.assertEquals(13, items.length); } + + @Test + public void testTraceKeys() { + TraceContext endTrxContext = new TraceContext(); + endTrxContext.setTraceType(TraceType.EndTransaction); + endTrxContext.setGroupName("PID-test"); + endTrxContext.setRegionId("DefaultRegion"); + endTrxContext.setTimeStamp(time); + TraceBean endTrxTraceBean = new TraceBean(); + endTrxTraceBean.setTopic("topic-test"); + endTrxTraceBean.setKeys("Keys Keys2"); + endTrxTraceBean.setTags("Tags"); + endTrxTraceBean.setMsgId("AC1415116D1418B4AAC217FE1B4E0000"); + endTrxTraceBean.setStoreHost("127.0.0.1:10911"); + endTrxTraceBean.setMsgType(MessageType.Trans_msg_Commit); + endTrxTraceBean.setTransactionId("transactionId"); + endTrxTraceBean.setTransactionState(LocalTransactionState.COMMIT_MESSAGE); + endTrxTraceBean.setFromTransactionCheck(false); + List traceBeans = new ArrayList(); + traceBeans.add(endTrxTraceBean); + endTrxContext.setTraceBeans(traceBeans); + + TraceTransferBean traceTransferBean = TraceDataEncoder.encoderFromContextBean(endTrxContext); + + Set keys = traceTransferBean.getTransKey(); + assertThat(keys).contains("Keys"); + assertThat(keys).contains("Keys2"); + } }