Browse Source

HADOOP-17430. Restore ability to set Text to empty byte array (#2545)


Contributed by gaozhan.ding
dgzdot 4 years ago
parent
commit
b1abb10ea2

+ 10 - 2
hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/Text.java

@@ -223,10 +223,18 @@ public class Text extends BinaryComparable
   }
   }
 
 
   /**
   /**
-   * Set to a utf8 byte array.
+   * Set to a utf8 byte array. If the length of <code>utf8</code> is
+   * <em>zero</em>, actually clear {@link #bytes} and any existing
+   * data is lost.
    */
    */
   public void set(byte[] utf8) {
   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);
+    }
   }
   }
 
 
   /**
   /**

+ 18 - 0
hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/io/TestText.java

@@ -459,4 +459,22 @@ public class TestText {
             2, Text.utf8Length(new String(new char[]{(char)254})));
             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());
+  }
 }
 }