Index: src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java (revision 1221595) +++ src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java (working copy) @@ -79,6 +79,7 @@ import org.apache.hadoop.hbase.YouAreDeadException; import org.apache.hadoop.hbase.catalog.CatalogTracker; import org.apache.hadoop.hbase.catalog.MetaEditor; +import org.apache.hadoop.hbase.catalog.MetaReader; import org.apache.hadoop.hbase.catalog.RootLocationEditor; import org.apache.hadoop.hbase.client.Action; import org.apache.hadoop.hbase.client.Append; @@ -2636,9 +2637,19 @@ checkIfRegionInTransition(region, OPEN); HRegion onlineRegion = this.getFromOnlineRegions(region.getEncodedName()); if (null != onlineRegion) { - LOG.warn("Attempted open of " + region.getEncodedName() - + " but already online on this server"); - return RegionOpeningState.ALREADY_OPENED; + // See HBASE-5094. Cross check with META if still this RS is owning the + // region. + Pair p = MetaReader.getRegion( + this.catalogTracker, region.getRegionName()); + if (this.getServerName().equals(p.getSecond())) { + LOG.warn("Attempted open of " + region.getEncodedName() + + " but already online on this server"); + return RegionOpeningState.ALREADY_OPENED; + } else { + LOG.warn("The region " + region.getEncodedName() + + " is online on this server but META does not have this server."); + this.removeFromOnlineRegions(region.getEncodedName()); + } } LOG.info("Received request to open region: " + region.getRegionNameAsString());