Repository: hbase Updated Branches: refs/heads/branch-1.1 55212d531 -> e4ef86cbd
HBASE-15125 HBaseFsck's adoptHdfsOrphan function creates region with wrong end key boundary (chenrongwei) Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/e4ef86cb Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/e4ef86cb Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/e4ef86cb Branch: refs/heads/branch-1.1 Commit: e4ef86cbdf373df7f436a11c485280df566859a1 Parents: 55212d5 Author: Stephen Yuan Jiang <[email protected]> Authored: Wed May 18 08:34:46 2016 -0700 Committer: Stephen Yuan Jiang <[email protected]> Committed: Wed May 18 08:34:46 2016 -0700 ---------------------------------------------------------------------- .../org/apache/hadoop/hbase/util/HBaseFsck.java | 3 +- .../apache/hadoop/hbase/util/TestHBaseFsck.java | 62 +++++++++++++++++++- 2 files changed, 63 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/e4ef86cb/hbase-server/src/main/java/org/apache/hadoop/hbase/util/HBaseFsck.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/HBaseFsck.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/util/HBaseFsck.java index e14c858..7962f99 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/HBaseFsck.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/util/HBaseFsck.java @@ -916,7 +916,8 @@ public class HBaseFsck extends Configured implements Closeable { Bytes.toString(orphanRegionRange.getSecond()) + ")"); // create new region on hdfs. move data into place. - HRegionInfo hri = new HRegionInfo(template.getTableName(), orphanRegionRange.getFirst(), orphanRegionRange.getSecond()); + HRegionInfo hri = new HRegionInfo(template.getTableName(), orphanRegionRange.getFirst(), + Bytes.add(orphanRegionRange.getSecond(), new byte[1])); LOG.info("Creating new region : " + hri); HRegion region = HBaseFsckRepair.createHDFSRegionDir(getConf(), hri, template); Path target = region.getRegionFileSystem().getRegionDir(); http://git-wip-us.apache.org/repos/asf/hbase/blob/e4ef86cb/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestHBaseFsck.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestHBaseFsck.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestHBaseFsck.java index 3731a51..153b0cd 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestHBaseFsck.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestHBaseFsck.java @@ -447,7 +447,7 @@ public class TestHBaseFsck { } /** - * Counts the number of row to verify data loss or non-dataloss. + * Counts the number of rows to verify data loss or non-dataloss. */ int countRows() throws IOException { Scan s = new Scan(); @@ -460,6 +460,19 @@ public class TestHBaseFsck { } /** + * Counts the number of rows to verify data loss or non-dataloss. + */ + int countRows(byte[] start, byte[] end) throws IOException { + Scan s = new Scan(start, end); + ResultScanner rs = tbl.getScanner(s); + int i = 0; + while (rs.next() != null) { + i++; + } + return i; + } + + /** * delete table in preparation for next test * * @param tablename @@ -1227,6 +1240,53 @@ public class TestHBaseFsck { } /** + * This creates and fixes a bad table with a missing region -- hole in meta and data present but + * .regioninfo missing (an orphan hdfs region)in the fs. At last we check every row was present + * at the correct region. + */ + @Test(timeout = 180000) + public void testHDFSRegioninfoMissingAndCheckRegionBoundary() throws Exception { + TableName table = TableName.valueOf("testHDFSRegioninfoMissingAndCheckRegionBoundary"); + try { + setupTable(table); + assertEquals(ROWKEYS.length, countRows()); + + // Mess it up by leaving a hole in the meta data + admin.disableTable(table); + deleteRegion(conf, tbl.getTableDescriptor(), Bytes.toBytes("B"), Bytes.toBytes("C"), true, + true, false, true, HRegionInfo.DEFAULT_REPLICA_ID); + admin.enableTable(table); + + HBaseFsck hbck = doFsck(conf, false); + assertErrors(hbck, + new HBaseFsck.ErrorReporter.ERROR_CODE[] { + HBaseFsck.ErrorReporter.ERROR_CODE.ORPHAN_HDFS_REGION, + HBaseFsck.ErrorReporter.ERROR_CODE.NOT_IN_META_OR_DEPLOYED, + HBaseFsck.ErrorReporter.ERROR_CODE.HOLE_IN_REGION_CHAIN }); + // holes are separate from overlap groups + assertEquals(0, hbck.getOverlapGroups(table).size()); + + // fix hole + doFsck(conf, true); + + // check that hole fixed + assertNoErrors(doFsck(conf, false)); + + // check data belong to the correct region,every scan should get one row. + for (int i = 0; i < ROWKEYS.length; i++) { + if (i != ROWKEYS.length - 1) { + assertEquals(1, countRows(ROWKEYS[i], ROWKEYS[i + 1])); + } else { + assertEquals(1, countRows(ROWKEYS[i], null)); + } + } + + } finally { + cleanupTable(table); + } + } + + /** * This creates and fixes a bad table with a region that is missing meta and * not assigned to a region server. */
