Index: src/main/java/org/apache/hadoop/hbase/master/handler/TableEventHandler.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/master/handler/TableEventHandler.java (revision 1187647) +++ src/main/java/org/apache/hadoop/hbase/master/handler/TableEventHandler.java (working copy) @@ -20,6 +20,7 @@ package org.apache.hadoop.hbase.master.handler; import java.io.IOException; +import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.NavigableMap; @@ -77,19 +78,17 @@ @Override public void process() { try { - LOG.info("Handling table operation " + eventType + " on table " + - Bytes.toString(tableName)); - List hris = - MetaReader.getTableRegions(this.server.getCatalogTracker(), - tableName); + LOG.info("Handling table operation " + eventType + " on table " + + Bytes.toString(tableName)); + List hris = MetaReader.getTableRegions( + this.server.getCatalogTracker(), tableName); handleTableOperation(hris); - if (eventType.isOnlineSchemaChangeSupported() && this.masterServices. - getAssignmentManager().getZKTable(). - isEnabledTable(Bytes.toString(tableName))) { - this.masterServices.getAssignmentManager().setRegionsToReopen(hris); + if (eventType.isOnlineSchemaChangeSupported() && + this.masterServices.getAssignmentManager().getZKTable() + .isEnabledTable(Bytes.toString(tableName))) { if (reOpenAllRegions(hris)) { - LOG.info("Completed table operation " + eventType + " on table " + - Bytes.toString(tableName)); + LOG.info("Completed table operation " + eventType + " on table " + + Bytes.toString(tableName)); } else { LOG.warn("Error on reopening the regions"); } @@ -105,20 +104,29 @@ boolean done = false; LOG.info("Bucketing regions by region server..."); HTable table = new HTable(masterServices.getConfiguration(), tableName); - TreeMap> serverToRegions = Maps - .newTreeMap(); + TreeMap> serverToRegions = Maps.newTreeMap(); NavigableMap hriHserverMapping = table.getRegionLocations(); - + List reRegions = new ArrayList(); for (HRegionInfo hri : regions) { ServerName rsLocation = hriHserverMapping.get(hri); + + // Skip the offlined split parent region + // See HBASE-4578 for more information. + if (null == rsLocation) { + LOG.info("Skip " + hri); + continue; + } if (!serverToRegions.containsKey(rsLocation)) { LinkedList hriList = Lists.newLinkedList(); serverToRegions.put(rsLocation, hriList); } + reRegions.add(hri); serverToRegions.get(rsLocation).add(hri); } - LOG.info("Reopening " + regions.size() + " regions on " + + LOG.info("Reopening " + reRegions.size() + " regions on " + serverToRegions.size() + " region servers."); + this.masterServices.getAssignmentManager().setRegionsToReopen(reRegions); BulkReOpen bulkReopen = new BulkReOpen(this.server, serverToRegions, this.masterServices.getAssignmentManager()); while (true) { @@ -138,6 +146,7 @@ } return done; } + protected abstract void handleTableOperation(List regions) - throws IOException, KeeperException; + throws IOException, KeeperException; }