From 13897a098c028f76fe6636d9c724f568af385c45 Mon Sep 17 00:00:00 2001 From: Istvan Toth Date: Wed, 1 Dec 2021 13:53:40 +0100 Subject: [PATCH 1/2] HBASE-26527 ArrayIndexOutOfBoundsException in KeyValueUtil.copyToNewKeyValue() Change-Id: I33099354f40b04b0f4f79f5cbd32445fe9d0d818 --- .../src/main/java/org/apache/hadoop/hbase/KeyValueUtil.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/KeyValueUtil.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/KeyValueUtil.java index 6b26dea0207a..173ee3c026a5 100644 --- a/hbase-common/src/main/java/org/apache/hadoop/hbase/KeyValueUtil.java +++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/KeyValueUtil.java @@ -128,7 +128,8 @@ public static KeyValue toNewKeyCell(final Cell cell) { } public static byte[] copyToNewByteArray(final Cell cell) { - int v1Length = cell.getSerializedSize(); + int v1Length = length(cell.getRowLength(), cell.getFamilyLength(), + cell.getQualifierLength(), cell.getValueLength(), cell.getTagsLength(), true); byte[] backingBytes = new byte[v1Length]; appendToByteArray(cell, backingBytes, 0, true); return backingBytes; From d754dcefb8725289dc5ef7055ddaf83cde115c28 Mon Sep 17 00:00:00 2001 From: Istvan Toth Date: Mon, 6 Dec 2021 08:06:31 +0100 Subject: [PATCH 2/2] added comment as requested by Duo Change-Id: Ibf9419d391560a209404bb7dcc6b583502d12bda --- .../src/main/java/org/apache/hadoop/hbase/KeyValueUtil.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/KeyValueUtil.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/KeyValueUtil.java index 173ee3c026a5..a2fdcc4e6d8c 100644 --- a/hbase-common/src/main/java/org/apache/hadoop/hbase/KeyValueUtil.java +++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/KeyValueUtil.java @@ -128,6 +128,9 @@ public static KeyValue toNewKeyCell(final Cell cell) { } public static byte[] copyToNewByteArray(final Cell cell) { + //Cell#getSerializedSize returns the serialized size of the Source cell, which may + //not serialize all fields. We are constructing a KeyValue backing array here, + //which does include all fields, and must allocate accordingly. int v1Length = length(cell.getRowLength(), cell.getFamilyLength(), cell.getQualifierLength(), cell.getValueLength(), cell.getTagsLength(), true); byte[] backingBytes = new byte[v1Length];