diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/janitor/ReportMakingVisitor.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/janitor/ReportMakingVisitor.java index 20b24ada2a5..b604216751c 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/janitor/ReportMakingVisitor.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/janitor/ReportMakingVisitor.java @@ -180,10 +180,10 @@ class ReportMakingVisitor implements MetaTableAccessor.CloseableVisitor { addOverlap(this.highestEndKeyRegionInfo, ri); } } + this.previous = ri; + this.highestEndKeyRegionInfo = + MetaFixer.getRegionInfoWithLargestEndKey(this.highestEndKeyRegionInfo, ri); } - this.previous = ri; - this.highestEndKeyRegionInfo = - MetaFixer.getRegionInfoWithLargestEndKey(this.highestEndKeyRegionInfo, ri); return ri; } diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/janitor/TestCatalogJanitorCluster.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/janitor/TestCatalogJanitorCluster.java index a0af5cdaeb9..85426a4ead4 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/janitor/TestCatalogJanitorCluster.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/janitor/TestCatalogJanitorCluster.java @@ -31,6 +31,7 @@ import org.apache.hadoop.hbase.HBaseTestingUtility; import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.MetaTableAccessor; import org.apache.hadoop.hbase.TableName; +import org.apache.hadoop.hbase.TableNotEnabledException; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.client.RegionInfo; import org.apache.hadoop.hbase.client.RegionInfoBuilder; @@ -66,6 +67,8 @@ public class TestCatalogJanitorCluster { private static final TableName T3 = TableName.valueOf("t3"); private static final TableName T4 = TableName.valueOf("t4"); private static final TableName T5 = TableName.valueOf("t5"); + private static final TableName T6 = TableName.valueOf("t6"); + private static final TableName T7 = TableName.valueOf("t7"); @Before public void before() throws Exception { @@ -82,6 +85,9 @@ public class TestCatalogJanitorCluster { final byte[][] keysForT5 = { Bytes.toBytes("bb"), Bytes.toBytes("cc"), Bytes.toBytes("dd") }; TEST_UTIL.createTable(T5, HConstants.CATALOG_FAMILY, keysForT5); + + TEST_UTIL.createMultiRegionTable(T6, new byte[][] { HConstants.CATALOG_FAMILY }); + TEST_UTIL.createMultiRegionTable(T7, new byte[][] { HConstants.CATALOG_FAMILY }); } @After @@ -227,7 +233,7 @@ public class TestCatalogJanitorCluster { } @Test - public void testHoles() throws IOException { + public void testHoles() throws IOException, InterruptedException { CatalogJanitor janitor = TEST_UTIL.getHBaseCluster().getMaster().getCatalogJanitor(); CatalogJanitorReport report = janitor.getLastReport(); @@ -237,6 +243,9 @@ public class TestCatalogJanitorCluster { verifyCornerHoles(janitor, T1); // Verify start and end region holes verifyCornerHoles(janitor, T2); + // Verify start and end region holes when next table is disable see: HBASE-27560 + disableTable(T7); + verifyCornerHoles(janitor, T6); verifyMiddleHole(janitor); // Verify that MetaFixer is able to fix these holes fixHoles(janitor); @@ -246,8 +255,8 @@ public class TestCatalogJanitorCluster { MetaFixer metaFixer = new MetaFixer(TEST_UTIL.getHBaseCluster().getMaster()); janitor.scan(); CatalogJanitorReport report = janitor.getLastReport(); - // Verify total number of holes, 2 in t1 and t2 each and one in t3 - assertEquals("Number of holes are not matching", 5, report.getHoles().size()); + // Verify total number of holes, 2 in t1, t2, t6 each and one in t3 + assertEquals("Number of holes are not matching", 7, report.getHoles().size()); metaFixer.fix(); janitor.scan(); report = janitor.getLastReport(); @@ -320,4 +329,13 @@ public class TestCatalogJanitorCluster { assertNotNull(regionInfo); return regionInfo; } + + private void disableTable(TableName tableName) throws IOException, InterruptedException { + try { + TEST_UTIL.getAdmin().disableTable(tableName); + TEST_UTIL.waitTableDisabled(tableName, 30000); + } catch (TableNotEnabledException e) { + LOG.debug("Table: " + tableName + " already disabled, ignore."); + } + } }