commit 7a16c8cd5b4f8ec4d5fa7a0e7d8f93e08f014b80 Author: Devaraj Das Date: Thu Jan 9 18:16:49 2014 -0800 Fixed hbck to work with replicas 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 3c8b2ad..93cba00 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 @@ -1752,6 +1752,7 @@ public class HBaseFsck extends Configured { if (hbi.containsOnlyHdfsEdits()) { return; } + if (hbi.isSkipChecks()) return; if (inMeta && inHdfs && isDeployed && deploymentMatchesMeta && shouldBeDeployed) { return; } else if (inMeta && inHdfs && !shouldBeDeployed && !isDeployed) { @@ -1916,13 +1917,11 @@ public class HBaseFsck extends Configured { */ SortedMap checkIntegrity() throws IOException { tablesInfo = new TreeMap (); - List noHDFSRegionInfos = new ArrayList(); LOG.debug("There are " + regionInfoMap.size() + " region info entries"); for (HbckInfo hbi : regionInfoMap.values()) { // Check only valid, working regions if (hbi.metaEntry == null) { // this assumes that consistency check has run loadMetaEntry - noHDFSRegionInfos.add(hbi); Path p = hbi.getHdfsRegionDir(); if (p == null) { errors.report("No regioninfo in Meta or HDFS. " + hbi); @@ -2894,6 +2893,10 @@ public class HBaseFsck extends Configured { } public synchronized void addServer(HRegionInfo hri, ServerName server) { + if (!hri.isPrimaryReplica()) { + // skip the hbck tests for the read only replica regions + this.setSkipChecks(true); + } OnlineEntry rse = new OnlineEntry() ; rse.hri = hri; rse.hsa = server; 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 8cddae8..2eb74b3 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 @@ -356,7 +356,19 @@ public class TestHBaseFsck { * @throws KeeperException */ HTable setupTable(TableName tablename) throws Exception { + return setupTableWithRegionReplica(tablename, 1); + } + + /** + * Setup a clean table with a certain region_replica count + * @param tableName + * @param replicaCount + * @return + * @throws Exception + */ + HTable setupTableWithRegionReplica(TableName tablename, int replicaCount) throws Exception { HTableDescriptor desc = new HTableDescriptor(tablename); + desc.setRegionReplication(replicaCount); HColumnDescriptor hcd = new HColumnDescriptor(Bytes.toString(FAM)); desc.addFamily(hcd); // If a table has no CF's it doesn't get checked TEST_UTIL.getHBaseAdmin().createTable(desc, SPLITS); @@ -552,6 +564,23 @@ public class TestHBaseFsck { } } + /* + * This creates a table with region_replica > 1 and verifies hbck runs + * successfully + */ + @Test + public void testHbckWithRegionReplica() throws Exception { + TableName table = + TableName.valueOf("tableWithReplica"); + try { + setupTableWithRegionReplica(table, 2); + assertNoErrors(doFsck(conf, false)); + assertEquals(ROWKEYS.length, countRows()); + } finally { + deleteTable(table); + } + } + /** * Get region info from local cluster. */