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());
+ }
}