Repository: hbase Updated Branches: refs/heads/branch-1 826bcf1bb -> 882f4c976
HBASE-12716 A bug in RegionSplitter.UniformSplit algorithm (Weichen Ye) Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/882f4c97 Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/882f4c97 Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/882f4c97 Branch: refs/heads/branch-1 Commit: 882f4c9761d9b94a600d1fe1d590f7e0a4e245f9 Parents: 826bcf1 Author: tedyu <[email protected]> Authored: Sun Dec 28 07:49:12 2014 -0800 Committer: tedyu <[email protected]> Committed: Sun Dec 28 07:49:12 2014 -0800 ---------------------------------------------------------------------- .../main/java/org/apache/hadoop/hbase/util/Bytes.java | 13 ++++++++++++- .../java/org/apache/hadoop/hbase/util/TestBytes.java | 5 +++-- .../apache/hadoop/hbase/util/TestRegionSplitter.java | 5 ++++- 3 files changed, 19 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/882f4c97/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 a342a48..9e79be3 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 @@ -1701,8 +1701,19 @@ public class Bytes { diffBI = diffBI.add(BigInteger.ONE); } final BigInteger splitsBI = BigInteger.valueOf(num + 1); + //when diffBI < splitBI, use an additional byte to increase diffBI if(diffBI.compareTo(splitsBI) < 0) { - return null; + byte[] aPaddedAdditional = new byte[aPadded.length+1]; + byte[] bPaddedAdditional = new byte[bPadded.length+1]; + for (int i = 0; i < aPadded.length; i++){ + aPaddedAdditional[i] = aPadded[i]; + } + for (int j = 0; j < bPadded.length; j++){ + bPaddedAdditional[j] = bPadded[j]; + } + aPaddedAdditional[aPadded.length] = 0; + bPaddedAdditional[bPadded.length] = 0; + return iterateOnSplits(aPaddedAdditional, bPaddedAdditional, inclusive, num); } final BigInteger intervalBI; try { http://git-wip-us.apache.org/repos/asf/hbase/blob/882f4c97/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 6d2c1ae..1a76536 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 @@ -101,9 +101,10 @@ public class TestBytes extends TestCase { } assertTrue("Returned split should have 3 parts but has " + parts.length, parts.length == 3); - // If split more than once, this should fail + // If split more than once, use additional byte to split parts = Bytes.split(low, high, 2); - assertTrue("Returned split but should have failed", parts == null); + assertTrue("Split with an additional byte", parts != null); + assertEquals(parts.length, low.length + 1); // Split 0 times should throw IAE try { http://git-wip-us.apache.org/repos/asf/hbase/blob/882f4c97/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestRegionSplitter.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestRegionSplitter.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestRegionSplitter.java index 475ee19..e343588 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestRegionSplitter.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestRegionSplitter.java @@ -207,6 +207,9 @@ public class TestRegionSplitter { xFF, xFF, xFF}, lastRow); assertArrayEquals(splitPoint, new byte[] {(byte)0xef, xFF, xFF, xFF, xFF, xFF, xFF, xFF}); + + splitPoint = splitter.split(new byte[] {'a', 'a', 'a'}, new byte[] {'a', 'a', 'b'}); + assertArrayEquals(splitPoint, new byte[] {'a', 'a', 'a', (byte)0x80 }); } @Test @@ -227,7 +230,7 @@ public class TestRegionSplitter { assertTrue(splitFailsPrecondition(algo, "\\xAA", "\\xAA")); // range error assertFalse(splitFailsPrecondition(algo, "\\x00", "\\x02", 3)); // should be fine assertFalse(splitFailsPrecondition(algo, "\\x00", "\\x0A", 11)); // should be fine - assertTrue(splitFailsPrecondition(algo, "\\x00", "\\x0A", 12)); // too granular + assertFalse(splitFailsPrecondition(algo, "\\x00", "\\x0A", 12)); // should be fine } private boolean splitFailsPrecondition(SplitAlgorithm algo) {
