Index: src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java (revision 1033765) +++ src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java (working copy) @@ -1105,7 +1105,7 @@ // Scan META for all user regions, skipping any disabled tables Map allRegions = - MetaReader.fullScan(catalogTracker, this.zkTable.getDisabledTables()); + MetaReader.fullScan(catalogTracker, this.zkTable.getDisabledTables(), true); if (allRegions == null || allRegions.isEmpty()) return; // Determine what type of assignment to do on startup Index: src/main/java/org/apache/hadoop/hbase/master/handler/EnableTableHandler.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/master/handler/EnableTableHandler.java (revision 1033765) +++ src/main/java/org/apache/hadoop/hbase/master/handler/EnableTableHandler.java (working copy) @@ -87,7 +87,7 @@ // Get the regions of this table. We're done when all listed // tables are onlined. List regionsInMeta = - MetaReader.getTableRegions(this.ct, tableName); + MetaReader.getTableRegions(this.ct, tableName, true); int countOfRegionsInTable = regionsInMeta.size(); List regions = regionsToAssign(regionsInMeta); if (regions.size() == 0) { Index: src/main/java/org/apache/hadoop/hbase/catalog/MetaReader.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/catalog/MetaReader.java (revision 1033765) +++ src/main/java/org/apache/hadoop/hbase/catalog/MetaReader.java (working copy) @@ -150,6 +150,28 @@ public static Map fullScan( CatalogTracker catalogTracker, final Set disabledTables) throws IOException { + return fullScan(catalogTracker, disabledTables, false); + } + + /** + * Performs a full scan of .META., skipping regions from any + * tables in the specified set of disabled tables. + *

+ * Returns a map of every region to it's currently assigned server, according + * to META. If the region does not have an assignment it will have a null + * value in the map. + * + * @param catalogTracker + * @param disabledTables set of disabled tables that will not be returned + * @param excludeOfflinedSplitParents If true, do not include offlined split + * parents in the return. + * @return map of regions to their currently assigned server + * @throws IOException + */ + public static Map fullScan( + CatalogTracker catalogTracker, final Set disabledTables, + final boolean excludeOfflinedSplitParents) + throws IOException { final Map regions = new TreeMap(); Visitor v = new Visitor() { @@ -158,9 +180,12 @@ if (r == null || r.isEmpty()) return true; Pair region = metaRowToRegionPair(r); if (region == null) return true; + HRegionInfo hri = region.getFirst(); if (disabledTables.contains( - region.getFirst().getTableDesc().getNameAsString())) return true; - regions.put(region.getFirst(), region.getSecond()); + hri.getTableDesc().getNameAsString())) return true; + // Are we to include split parents in the list? + if (excludeOfflinedSplitParents && hri.isSplitParent()) return true; + regions.put(hri, region.getSecond()); return true; } }; @@ -416,6 +441,21 @@ public static List getTableRegions(CatalogTracker catalogTracker, byte [] tableName) throws IOException { + return getTableRegions(catalogTracker, tableName, false); + } + + /** + * Gets all of the regions of the specified table. + * @param catalogTracker + * @param tableName + * @param excludeOfflinedSplitParents If true, do not include offlined split + * parents in the return. + * @return Ordered list of {@link HRegionInfo}. + * @throws IOException + */ + public static List getTableRegions(CatalogTracker catalogTracker, + byte [] tableName, final boolean excludeOfflinedSplitParents) + throws IOException { if (Bytes.equals(tableName, HConstants.ROOT_TABLE_NAME)) { // If root, do a bit of special handling. List list = new ArrayList(); @@ -446,6 +486,8 @@ data.getValue(HConstants.CATALOG_FAMILY, HConstants.REGIONINFO_QUALIFIER)); if (info.getTableDesc().getNameAsString().equals(tableString)) { + // Are we to include split parents in the list? + if (excludeOfflinedSplitParents && info.isSplitParent()) continue; regions.add(info); } else { break;