From 014172cd937f3e9ff4dbb066b0de3a038620409f Mon Sep 17 00:00:00 2001 From: mazhengxuan Date: Wed, 22 Jul 2026 14:17:38 +0800 Subject: [PATCH] HBASE-30092 Avoid stringifying protobuf RPC parameters in task snapshots --- .../monitoring/MonitoredRPCHandlerImpl.java | 3 +++ .../hbase/monitoring/TestTaskMonitor.java | 20 +++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/monitoring/MonitoredRPCHandlerImpl.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/monitoring/MonitoredRPCHandlerImpl.java index 81635fa9f1fc..9d4fd55bd588 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/monitoring/MonitoredRPCHandlerImpl.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/monitoring/MonitoredRPCHandlerImpl.java @@ -249,6 +249,9 @@ private Map generateCallInfoMap() { paramList.add(Bytes.toStringBinary((byte[]) param)); } else if (param instanceof Operation) { paramList.add(((Operation) param).toMap()); + } else if (param instanceof Message) { + // Do not stringify protobufs, as large requests can OOM the monitoring path. + paramList.add(param.getClass().getSimpleName()); } else { paramList.add(param.toString()); } diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/monitoring/TestTaskMonitor.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/monitoring/TestTaskMonitor.java index 6e3ec0d16eb5..8c8ccdf39503 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/monitoring/TestTaskMonitor.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/monitoring/TestTaskMonitor.java @@ -42,6 +42,11 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.apache.hbase.thirdparty.com.google.protobuf.ByteString; + +import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos; +import org.apache.hadoop.hbase.shaded.protobuf.generated.FilterProtos; + @Tag(MiscTests.TAG) @Tag(SmallTests.TAG) public class TestTaskMonitor { @@ -289,6 +294,21 @@ public void testClone() throws Exception { assertNotEquals(clone.toJSON(), monitor.toJSON()); } + @Test + public void testCloneDoesNotStringifyProtobufParams() { + ClientProtos.ScanRequest request = ClientProtos.ScanRequest.newBuilder() + .setScan(ClientProtos.Scan.newBuilder().setFilter(FilterProtos.Filter.newBuilder() + .setName("large-filter").setSerializedFilter(ByteString.copyFrom(new byte[64 * 1024])))) + .build(); + MonitoredRPCHandlerImpl monitor = new MonitoredRPCHandlerImpl("test"); + monitor.setRPC("Scan", new Object[] { request }, 0); + monitor.setRPCPacket(request); + + Map rpcCall = (Map) monitor.clone().toMap().get("rpcCall"); + assertEquals(List.of("ScanRequest"), rpcCall.get("params")); + assertEquals((long) request.getSerializedSize(), rpcCall.get("packetlength")); + } + private class TestParam { public String param = null;