From b1abb10ea273b53896afbf766ea16a59138ce6e9 Mon Sep 17 00:00:00 2001 From: dgzdot <57993550+dgzdot@users.noreply.github.com> Date: Wed, 6 Jan 2021 05:09:41 +0800 Subject: [PATCH] HADOOP-17430. Restore ability to set Text to empty byte array (#2545) Contributed by gaozhan.ding --- .../main/java/org/apache/hadoop/io/Text.java | 12 ++++++++++-- .../java/org/apache/hadoop/io/TestText.java | 18 ++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/Text.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/Text.java index 6022b995441..49151002bae 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/Text.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/Text.java @@ -223,10 +223,18 @@ public void set(String string) { } /** - * Set to a utf8 byte array. + * Set to a utf8 byte array. If the length of utf8 is + * zero, actually clear {@link #bytes} and any existing + * data is lost. */ public void set(byte[] utf8) { - set(utf8, 0, utf8.length); + if (utf8.length == 0) { + bytes = EMPTY_BYTES; + length = 0; + textLength = -1; + } else { + set(utf8, 0, utf8.length); + } } /** diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/io/TestText.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/io/TestText.java index a72f06f7487..7ae5d7d7ca0 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/io/TestText.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/io/TestText.java @@ -459,4 +459,22 @@ public void testUtf8Length() { 2, Text.utf8Length(new String(new char[]{(char)254}))); } + @Test + public void testSetBytes(){ + Text a = new Text(new byte[100]); + assertEquals("testSetBytes100 getLength error !", + 100, a.getLength()); + assertEquals("testSetBytes100 getBytes.length error !", + 100, a.getBytes().length); + assertEquals("testSetBytes100 getTextLength error !", + 100, a.getTextLength()); + + a.set(new byte[0]); + assertEquals("testSetBytes0 getLength error !", + 0, a.getLength()); + assertEquals("testSetBytes0 getBytes.length error !", + 0, a.getBytes().length); + assertEquals("testSetBytes0 getTextLength error !", + 0, a.getTextLength()); + } }