Repository: hbase
Updated Branches:
  refs/heads/branch-2.0 d026f3c5d -> cf915f9c7


HBASE-21208 Bytes#toShort doesn't work without unsafe

Signed-off-by: Ted Yu <[email protected]>
Signed-off-by: anoopsamjohn <[email protected]>
Signed-off-by: Reid Chan <[email protected]>


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/cf915f9c
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/cf915f9c
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/cf915f9c

Branch: refs/heads/branch-2.0
Commit: cf915f9c7c63c5361f99d906b3c9d89b97f706b1
Parents: d026f3c
Author: Chia-Ping Tsai <[email protected]>
Authored: Tue Sep 25 10:18:47 2018 +0800
Committer: Chia-Ping Tsai <[email protected]>
Committed: Tue Sep 25 10:29:30 2018 +0800

----------------------------------------------------------------------
 .../org/apache/hadoop/hbase/util/Bytes.java     |  7 ++--
 .../org/apache/hadoop/hbase/util/TestBytes.java | 44 ++++++++++++++++++++
 2 files changed, 48 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/cf915f9c/hbase-common/src/main/java/org/apache/hadoop/hbase/util/Bytes.java
----------------------------------------------------------------------
diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/util/Bytes.java 
b/hbase-common/src/main/java/org/apache/hadoop/hbase/util/Bytes.java
index 15facea..faaab6f 100644
--- a/hbase-common/src/main/java/org/apache/hadoop/hbase/util/Bytes.java
+++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/util/Bytes.java
@@ -130,7 +130,8 @@ public class Bytes implements Comparable<Bytes> {
   // SizeOf which uses java.lang.instrument says 24 bytes. (3 longs?)
   public static final int ESTIMATED_HEAP_TAX = 16;
 
-  private static final boolean UNSAFE_UNALIGNED = 
UnsafeAvailChecker.unaligned();
+  @VisibleForTesting
+  static final boolean UNSAFE_UNALIGNED = UnsafeAvailChecker.unaligned();
 
   /**
    * Returns length of the byte array, returning 0 if the array is null.
@@ -1161,9 +1162,9 @@ public class Bytes implements Comparable<Bytes> {
       return UnsafeAccess.toShort(bytes, offset);
     } else {
       short n = 0;
-      n = (short) ((n ^ bytes[offset]) & 0xFF);
+      n = (short) (n ^ (bytes[offset] & 0xFF));
       n = (short) (n << 8);
-      n = (short) ((n ^ bytes[offset+1]) & 0xFF);
+      n = (short) (n ^ (bytes[offset + 1] & 0xFF));
       return n;
    }
   }

http://git-wip-us.apache.org/repos/asf/hbase/blob/cf915f9c/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestBytes.java
----------------------------------------------------------------------
diff --git 
a/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestBytes.java 
b/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestBytes.java
index cea615e..8b206e2 100644
--- a/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestBytes.java
+++ b/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestBytes.java
@@ -22,6 +22,8 @@ import java.io.ByteArrayOutputStream;
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
 import java.io.IOException;
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
 import java.math.BigDecimal;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
@@ -44,6 +46,48 @@ public class TestBytes extends TestCase {
   public static final HBaseClassTestRule CLASS_RULE =
       HBaseClassTestRule.forClass(TestBytes.class);
 
+  private static void setUnsafe(boolean value) throws Exception {
+    Field field = Bytes.class.getDeclaredField("UNSAFE_UNALIGNED");
+    field.setAccessible(true);
+    Field modifiersField = Field.class.getDeclaredField("modifiers");
+    modifiersField.setAccessible(true);
+    int oldModifiers = field.getModifiers();
+    modifiersField.setInt(field, oldModifiers & ~Modifier.FINAL);
+    try {
+      field.set(null, value);
+    } finally {
+      modifiersField.setInt(field, oldModifiers);
+    }
+    assertEquals(Bytes.UNSAFE_UNALIGNED, value);
+  }
+
+  public void testShort() throws Exception  {
+    testShort(false);
+  }
+
+  public void testShortUnsafe() throws Exception  {
+    testShort(true);
+  }
+
+  private static void testShort(boolean unsafe) throws Exception  {
+    setUnsafe(unsafe);
+    try {
+      for (short n : Arrays.asList(
+              Short.MIN_VALUE,
+              (short) -100,
+              (short) -1,
+              (short) 0,
+              (short) 1,
+              (short) 300,
+              Short.MAX_VALUE)) {
+        byte[] bytes = Bytes.toBytes(n);
+        assertEquals(Bytes.toShort(bytes, 0, bytes.length), n);
+      }
+    } finally {
+      setUnsafe(UnsafeAvailChecker.unaligned());
+    }
+  }
+
   public void testNullHashCode() {
     byte [] b = null;
     Exception ee = null;

Reply via email to