From 4da51f5f22d9d17effa07bdc7982e9fabb531e3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A8=84=E5=B8=85?= Date: Fri, 8 Aug 2014 10:49:00 -0500 Subject: [PATCH] HBASE-11708 RegionSplitter incorrectly calculates splitcount. --- .../apache/hadoop/hbase/util/RegionSplitter.java | 13 ++++++++++--- .../hadoop/hbase/util/TestRegionSplitter.java | 19 +++++++++++++++++++ 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/RegionSplitter.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/util/RegionSplitter.java index 8a2ffaa..58e7a8b 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/RegionSplitter.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/util/RegionSplitter.java @@ -532,16 +532,20 @@ public class RegionSplitter { admin.split(table.getTableName(), split); LinkedList> finished = Lists.newLinkedList(); + LinkedList> local_finished = Lists.newLinkedList(); if (conf.getBoolean("split.verify", true)) { // we need to verify and rate-limit our splits outstanding.addLast(dr); // with too many outstanding splits, wait for some to finish while (outstanding.size() >= MAX_OUTSTANDING) { - finished = splitScan(outstanding, table, splitAlgo); - if (finished.isEmpty()) { + LOG.debug("Wait for outstanding splits " + outstanding.size()); + local_finished = splitScan(outstanding, table, splitAlgo); + if (local_finished.isEmpty()) { Thread.sleep(30 * 1000); } else { - outstanding.removeAll(finished); + finished.addAll(local_finished); + outstanding.removeAll(local_finished); + LOG.debug(local_finished.size() + " outstanding splits finished"); } } } else { @@ -565,6 +569,7 @@ public class RegionSplitter { } if (conf.getBoolean("split.verify", true)) { while (!outstanding.isEmpty()) { + LOG.debug("Finally Wait for outstanding splits " + outstanding.size()); LinkedList> finished = splitScan(outstanding, table, splitAlgo); if (finished.isEmpty()) { @@ -574,7 +579,9 @@ public class RegionSplitter { for (Pair region : finished) { splitOut.writeChars("- " + splitAlgo.rowToStr(region.getFirst()) + " " + splitAlgo.rowToStr(region.getSecond()) + "\n"); + splitCount++; } + LOG.debug("Finally " + finished.size() + " outstanding splits finished"); } } } 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 407be0d..2e4fd08f 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 @@ -53,6 +53,7 @@ import org.junit.experimental.categories.Category; public class TestRegionSplitter { private final static Log LOG = LogFactory.getLog(TestRegionSplitter.class); private final static HBaseTestingUtility UTIL = new HBaseTestingUtility(); + private final static String TABLE_NAME = "SPLIT_TEST_TABLE"; private final static String CF_NAME = "SPLIT_TEST_CF"; private final static byte xFF = (byte) 0xff; @@ -282,6 +283,24 @@ public class TestRegionSplitter { verifyBounds(expectedBounds, tableName); } + @Test + public void splitCountTest() throws Exception { + final Configuration conf = UTIL.getConfiguration(); + final List expectedBounds = new ArrayList(); + final byte[] TEST_TABLE = Bytes.toBytes(TABLE_NAME); + final byte[] TEST_FAMILY = Bytes.toBytes(CF_NAME); + + UTIL.createTable(TEST_TABLE, TEST_FAMILY); + + expectedBounds.add(ArrayUtils.EMPTY_BYTE_ARRAY); + expectedBounds.add(new byte[] {0x7f, (byte)0xff, (byte)0xff, (byte)0xff, + (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff}); + expectedBounds.add(ArrayUtils.EMPTY_BYTE_ARRAY); + + conf.setBoolean("split.verify", true); + rollingSplitAndVerify(TABLE_NAME, "UniformSplit", expectedBounds); + } + private void rollingSplitAndVerify(String tableName, String splitClass, List expectedBounds) throws Exception { final Configuration conf = UTIL.getConfiguration(); -- 1.7.10.2 (Apple Git-33)