From b1e944cc8232db387e77cb3e0cb8bcf21e38ddaa Mon Sep 17 00:00:00 2001 From: Aman Gautam Date: Sat, 27 Jun 2026 21:30:05 +0530 Subject: [PATCH 1/2] Optimize gRPC message body conversion with zero-copy ByteString --- .../proxy/grpc/v2/common/GrpcConverter.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/proxy/src/main/java/org/apache/rocketmq/proxy/grpc/v2/common/GrpcConverter.java b/proxy/src/main/java/org/apache/rocketmq/proxy/grpc/v2/common/GrpcConverter.java index 87d20ebca1b..94199f45308 100644 --- a/proxy/src/main/java/org/apache/rocketmq/proxy/grpc/v2/common/GrpcConverter.java +++ b/proxy/src/main/java/org/apache/rocketmq/proxy/grpc/v2/common/GrpcConverter.java @@ -28,7 +28,7 @@ import apache.rocketmq.v2.MessageType; import apache.rocketmq.v2.Resource; import apache.rocketmq.v2.SystemProperties; -import com.google.protobuf.ByteString; +import com.google.protobuf.UnsafeByteOperations; import com.google.protobuf.util.Timestamps; import java.net.SocketAddress; import java.util.Arrays; @@ -99,11 +99,13 @@ public Message buildMessage(MessageExt messageExt) { Resource topic = buildResource(messageExt.getTopic()); return Message.newBuilder() - .setTopic(topic) - .putAllUserProperties(userProperties) - .setSystemProperties(systemProperties) - .setBody(ByteString.copyFrom(messageExt.getBody())) - .build(); + .setTopic(topic) + .putAllUserProperties(userProperties) + .setSystemProperties(systemProperties) + // Safe: body is a dedicated byte[] allocated during deserialization + // and is not mutated after this point. + .setBody(UnsafeByteOperations.unsafeWrap(messageExt.getBody())) + .build(); } protected Map buildUserAttributes(MessageExt messageExt) { From 63eb9f1ec24c76f5e0b9b10a1c26fe4e2a509a22 Mon Sep 17 00:00:00 2001 From: Aman Gautam Date: Sat, 27 Jun 2026 23:24:58 +0530 Subject: [PATCH 2/2] ci: trigger rerun --- .../apache/rocketmq/proxy/grpc/v2/common/GrpcConverter.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/proxy/src/main/java/org/apache/rocketmq/proxy/grpc/v2/common/GrpcConverter.java b/proxy/src/main/java/org/apache/rocketmq/proxy/grpc/v2/common/GrpcConverter.java index 94199f45308..ef7b66aca72 100644 --- a/proxy/src/main/java/org/apache/rocketmq/proxy/grpc/v2/common/GrpcConverter.java +++ b/proxy/src/main/java/org/apache/rocketmq/proxy/grpc/v2/common/GrpcConverter.java @@ -102,8 +102,10 @@ public Message buildMessage(MessageExt messageExt) { .setTopic(topic) .putAllUserProperties(userProperties) .setSystemProperties(systemProperties) - // Safe: body is a dedicated byte[] allocated during deserialization - // and is not mutated after this point. + // Safety: unsafeWrap() aliases the decoded body byte[]. + // The decoded body array must not be mutated or reused while the + // returned protobuf Message (or any serialized form of it) may still + // be referenced. .setBody(UnsafeByteOperations.unsafeWrap(messageExt.getBody())) .build(); }