diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java index ec2dc2b..6c8b288 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java +++ hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java @@ -28,13 +28,17 @@ import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.hbase.HRegionInfo; import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.Server; +import org.apache.hadoop.hbase.ServerName; +import org.apache.hadoop.hbase.catalog.MetaReader; import org.apache.hadoop.hbase.executor.EventHandler; import org.apache.hadoop.hbase.executor.EventType; import org.apache.hadoop.hbase.regionserver.HRegion; import org.apache.hadoop.hbase.regionserver.RegionServerAccounting; import org.apache.hadoop.hbase.regionserver.RegionServerServices; import org.apache.hadoop.hbase.util.CancelableProgressable; +import org.apache.hadoop.hbase.util.Pair; import org.apache.hadoop.hbase.zookeeper.ZKAssign; +import org.apache.hadoop.hbase.zookeeper.ZKUtil; import org.apache.zookeeper.KeeperException; /** @@ -372,6 +376,44 @@ public class OpenRegionHandler extends EventHandler { " OPENING to OPENED got a version mismatch, someone else clashed " + "so now unassigning -- closing region on server: " + this.server.getServerName()); + // HBASE-9387 + // Cross check with META if still this RS is owning the region. + String node = ZKAssign.getNodeName(this.server.getZooKeeper(), hri.getEncodedName()); + if(ZKUtil.checkExists(this.server.getZooKeeper(), node) == -1){ + boolean needAbortCurrentRS = false; + try{ + ServerName loc = null; + if(hri.equals(HRegionInfo.FIRST_META_REGIONINFO)){ + loc = rsServices.getCatalogTracker().getMetaLocation(); + }else { + Pair p = MetaReader.getRegion( + rsServices.getCatalogTracker(), r.getRegionName()); + if(p!=null){ + loc = p.getSecond(); + } + } + if(loc == null) { + // can't determine where the region is + needAbortCurrentRS = true; + } else { + if (this.server.getServerName().equals(loc)) { + // current RS still owns it so proceed region open process + return true; + } else { + // close the region as someone else owns it + return false; + } + } + } catch(Exception ex) { + LOG.warn("Can't get region location for region " + r.getRegionInfo().getEncodedName(), + ex); + needAbortCurrentRS = true; + } + if(needAbortCurrentRS){ + server.abort("Error transitioning node in ZK (" + r.getRegionInfo().getEncodedName() + + ")", null); + } + } } else { LOG.debug("Transitioned " + r.getRegionInfo().getEncodedName() + " to OPENED in zk on " + this.server.getServerName());