You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by ke...@apache.org on 2020/09/30 16:41:02 UTC
[skywalking] 01/01: Only get backing array of ByteBuffer when it
has one
This is an automated email from the ASF dual-hosted git repository.
kezhenxu94 pushed a commit to branch muse-bug-bash/Bytebufferbackingarray
in repository https://gitbox.apache.org/repos/asf/skywalking.git
commit 8d4f7fd3fdd196a6b585b20f7235de500702f647
Author: kezhenxu94 <ke...@163.com>
AuthorDate: Thu Oct 1 00:38:06 2020 +0800
Only get backing array of ByteBuffer when it has one
ByteBuffer.array() shouldn't be called unless ByteBuffer.arrayOffset() is used or if the ByteBuffer was initialized using ByteBuffer.wrap() or ByteBuffer.allocate().
---
.../apm/plugin/avro/SWServerRPCPlugin.java | 21 +++++++++++++++++----
1 file changed, 17 insertions(+), 4 deletions(-)
diff --git a/apm-sniffer/apm-sdk-plugin/avro-plugin/src/main/java/org/apache/skywalking/apm/plugin/avro/SWServerRPCPlugin.java b/apm-sniffer/apm-sdk-plugin/avro-plugin/src/main/java/org/apache/skywalking/apm/plugin/avro/SWServerRPCPlugin.java
index d4014ed..113acbe 100644
--- a/apm-sniffer/apm-sdk-plugin/avro-plugin/src/main/java/org/apache/skywalking/apm/plugin/avro/SWServerRPCPlugin.java
+++ b/apm-sniffer/apm-sdk-plugin/avro-plugin/src/main/java/org/apache/skywalking/apm/plugin/avro/SWServerRPCPlugin.java
@@ -19,10 +19,10 @@
package org.apache.skywalking.apm.plugin.avro;
import java.nio.ByteBuffer;
+import java.nio.charset.StandardCharsets;
import java.util.Map;
import org.apache.avro.ipc.RPCContext;
import org.apache.avro.ipc.RPCPlugin;
-import org.apache.avro.util.Utf8;
import org.apache.skywalking.apm.agent.core.context.CarrierItem;
import org.apache.skywalking.apm.agent.core.context.ContextCarrier;
import org.apache.skywalking.apm.agent.core.context.ContextManager;
@@ -43,14 +43,27 @@ public class SWServerRPCPlugin extends RPCPlugin {
@Override
public void serverReceiveRequest(RPCContext context) {
- Map meta = context.requestCallMeta();
+ Map<String, ByteBuffer> meta = context.requestCallMeta();
ContextCarrier carrier = new ContextCarrier();
CarrierItem items = carrier.items();
while (items.hasNext()) {
items = items.next();
- ByteBuffer buffer = (ByteBuffer) meta.get(new Utf8(items.getHeadKey()));
- items.setHeadValue(new String(buffer.array()));
+ ByteBuffer buffer = meta.get(items.getHeadKey());
+ String headValue;
+ if (buffer.hasArray()) {
+ headValue = new String(buffer.array());
+ } else {
+ buffer.mark();
+
+ byte[] bs = new byte[buffer.remaining()];
+ buffer.get(bs);
+
+ headValue = new String(bs, StandardCharsets.UTF_8);
+
+ buffer.reset();
+ }
+ items.setHeadValue(headValue);
}
String operationName = prefix + context.getMessage().getName();