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;
