You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by sy...@apache.org on 2015/10/16 22:29:21 UTC
hbase git commit: HBASE-14536 Balancer & SSH interfering with each
other leading to unavailability (Stephen Yuan Jiang)
Repository: hbase
Updated Branches:
refs/heads/branch-1.1 f2b059ea7 -> 4c39c74ff
HBASE-14536 Balancer & SSH interfering with each other leading to unavailability (Stephen Yuan Jiang)
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/4c39c74f
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/4c39c74f
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/4c39c74f
Branch: refs/heads/branch-1.1
Commit: 4c39c74ff319c94517c53eb1a639ef7ed53d799c
Parents: f2b059e
Author: Stephen Yuan Jiang <sy...@gmail.com>
Authored: Fri Oct 16 13:27:24 2015 -0700
Committer: Stephen Yuan Jiang <sy...@gmail.com>
Committed: Fri Oct 16 13:28:32 2015 -0700
----------------------------------------------------------------------
.../hadoop/hbase/master/AssignmentManager.java | 44 ++++++++++++++------
.../hadoop/hbase/master/ServerManager.java | 3 +-
.../handler/MetaServerShutdownHandler.java | 32 +++++++++-----
.../master/handler/ServerShutdownHandler.java | 3 +-
4 files changed, 57 insertions(+), 25 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hbase/blob/4c39c74f/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java
index 09e2b2f..bf93ac3 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java
@@ -260,6 +260,10 @@ public class AssignmentManager extends ZooKeeperListener {
private RegionStateListener regionStateListener;
+ public enum ServerHostRegion {
+ NOT_HOSTING_REGION, HOSTING_REGION, UNKNOWN,
+ }
+
/**
* Constructs a new assignment manager.
*
@@ -3382,16 +3386,16 @@ public class AssignmentManager extends ZooKeeperListener {
threadPoolExecutorService.submit(new UnAssignCallable(this, regionInfo));
}
- public boolean isCarryingMeta(ServerName serverName) {
+ public ServerHostRegion isCarryingMeta(ServerName serverName) {
return isCarryingRegion(serverName, HRegionInfo.FIRST_META_REGIONINFO);
}
- public boolean isCarryingMetaReplica(ServerName serverName, int replicaId) {
+ public ServerHostRegion isCarryingMetaReplica(ServerName serverName, int replicaId) {
return isCarryingRegion(serverName,
RegionReplicaUtil.getRegionInfoForReplica(HRegionInfo.FIRST_META_REGIONINFO, replicaId));
}
- public boolean isCarryingMetaReplica(ServerName serverName, HRegionInfo metaHri) {
+ public ServerHostRegion isCarryingMetaReplica(ServerName serverName, HRegionInfo metaHri) {
return isCarryingRegion(serverName, metaHri);
}
@@ -3405,7 +3409,7 @@ public class AssignmentManager extends ZooKeeperListener {
* processing hasn't finished yet when server shutdown occurs.
* @return whether the serverName currently hosts the region
*/
- private boolean isCarryingRegion(ServerName serverName, HRegionInfo hri) {
+ private ServerHostRegion isCarryingRegion(ServerName serverName, HRegionInfo hri) {
RegionTransition rt = null;
try {
byte [] data = ZKAssign.getData(watcher, hri.getEncodedName());
@@ -3423,17 +3427,33 @@ public class AssignmentManager extends ZooKeeperListener {
boolean matchZK = addressFromZK.equals(serverName);
LOG.debug("Checking region=" + hri.getRegionNameAsString() + ", zk server=" + addressFromZK +
" current=" + serverName + ", matches=" + matchZK);
- return matchZK;
+ return matchZK ? ServerHostRegion.HOSTING_REGION : ServerHostRegion.NOT_HOSTING_REGION;
}
ServerName addressFromAM = regionStates.getRegionServerOfRegion(hri);
- boolean matchAM = (addressFromAM != null &&
- addressFromAM.equals(serverName));
- LOG.debug("based on AM, current region=" + hri.getRegionNameAsString() +
- " is on server=" + (addressFromAM != null ? addressFromAM : "null") +
- " server being checked: " + serverName);
-
- return matchAM;
+ if (addressFromAM != null) {
+ boolean matchAM = addressFromAM.equals(serverName);
+ LOG.debug("based on AM, current region=" + hri.getRegionNameAsString() +
+ " is on server=" + (addressFromAM != null ? addressFromAM : "null") +
+ " server being checked: " + serverName);
+ return matchAM ? ServerHostRegion.HOSTING_REGION : ServerHostRegion.NOT_HOSTING_REGION;
+ }
+
+ if (hri.isMetaRegion() && RegionReplicaUtil.isDefaultReplica(hri)) {
+ // For the Meta region (default replica), we can do one more check on MetaTableLocator
+ final ServerName serverNameInZK =
+ server.getMetaTableLocator().getMetaRegionLocation(this.server.getZooKeeper());
+ LOG.debug("Based on MetaTableLocator, the META region is on server="
+ + (serverNameInZK == null ? "null" : serverNameInZK)
+ + " server being checked: " + serverName);
+ if (serverNameInZK != null) {
+ return serverNameInZK.equals(serverName) ?
+ ServerHostRegion.HOSTING_REGION : ServerHostRegion.NOT_HOSTING_REGION;
+ }
+ }
+ // Checked everywhere, if reaching here, we are sure that the server is not
+ // carrying region.
+ return ServerHostRegion.UNKNOWN;
}
/**
http://git-wip-us.apache.org/repos/asf/hbase/blob/4c39c74f/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java
index 564a99b..a4d3c6e 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java
@@ -614,7 +614,8 @@ public class ServerManager {
return;
}
- boolean carryingMeta = services.getAssignmentManager().isCarryingMeta(serverName);
+ boolean carryingMeta = services.getAssignmentManager().isCarryingMeta(serverName) ==
+ AssignmentManager.ServerHostRegion.HOSTING_REGION;
if (carryingMeta) {
this.services.getExecutorService().submit(new MetaServerShutdownHandler(this.master,
this.services, this.deadservers, serverName));
http://git-wip-us.apache.org/repos/asf/hbase/blob/4c39c74f/hbase-server/src/main/java/org/apache/hadoop/hbase/master/handler/MetaServerShutdownHandler.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/handler/MetaServerShutdownHandler.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/handler/MetaServerShutdownHandler.java
index f4bc8c3..abf4b20 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/handler/MetaServerShutdownHandler.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/handler/MetaServerShutdownHandler.java
@@ -87,17 +87,27 @@ public class MetaServerShutdownHandler extends ServerShutdownHandler {
// Assign meta if we were carrying it.
// Check again: region may be assigned to other where because of RIT
// timeout
- if (am.isCarryingMeta(serverName)) {
- LOG.info("Server " + serverName + " was carrying META. Trying to assign.");
- am.regionOffline(HRegionInfo.FIRST_META_REGIONINFO);
- verifyAndAssignMetaWithRetries();
- } else if (!server.getMetaTableLocator().isLocationAvailable(this.server.getZooKeeper())) {
- // the meta location as per master is null. This could happen in case when meta assignment
- // in previous run failed, while meta znode has been updated to null. We should try to
- // assign the meta again.
- verifyAndAssignMetaWithRetries();
- } else {
- LOG.info("META has been assigned to otherwhere, skip assigning.");
+ AssignmentManager.ServerHostRegion rsCarryingMetaRegion = am.isCarryingMeta(serverName);
+ switch (rsCarryingMetaRegion) {
+ case HOSTING_REGION:
+ LOG.info("Server " + serverName + " was carrying META. Trying to assign.");
+ am.regionOffline(HRegionInfo.FIRST_META_REGIONINFO);
+ verifyAndAssignMetaWithRetries();
+ break;
+ case UNKNOWN:
+ if (!server.getMetaTableLocator().isLocationAvailable(this.server.getZooKeeper())) {
+ // the meta location as per master is null. This could happen in case when meta
+ // assignment in previous run failed, while meta znode has been updated to null.
+ // We should try to assign the meta again.
+ verifyAndAssignMetaWithRetries();
+ break;
+ }
+ // fall through
+ case NOT_HOSTING_REGION:
+ LOG.info("META has been assigned to otherwhere, skip assigning.");
+ break;
+ default:
+ throw new IOException("Unsupported action in MetaServerShutdownHandler");
}
try {
http://git-wip-us.apache.org/repos/asf/hbase/blob/4c39c74f/hbase-server/src/main/java/org/apache/hadoop/hbase/master/handler/ServerShutdownHandler.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/handler/ServerShutdownHandler.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/handler/ServerShutdownHandler.java
index 7789ee1..163c942 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/handler/ServerShutdownHandler.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/handler/ServerShutdownHandler.java
@@ -225,7 +225,8 @@ public class ServerShutdownHandler extends EventHandler {
for (int i = 1; i < replicaCount; i++) {
HRegionInfo metaHri =
RegionReplicaUtil.getRegionInfoForReplica(HRegionInfo.FIRST_META_REGIONINFO, i);
- if (am.isCarryingMetaReplica(serverName, metaHri)) {
+ if (am.isCarryingMetaReplica(serverName, metaHri) ==
+ AssignmentManager.ServerHostRegion.HOSTING_REGION) {
LOG.info("Reassigning meta replica" + metaHri + " that was on " + serverName);
toAssignRegions.add(metaHri);
}