You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by jx...@apache.org on 2014/10/03 21:00:29 UTC
git commit: HBASE-12167 NPE in AssignmentManager
Repository: hbase
Updated Branches:
refs/heads/master d8a7b67d7 -> 5375ff07b
HBASE-12167 NPE in AssignmentManager
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/5375ff07
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/5375ff07
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/5375ff07
Branch: refs/heads/master
Commit: 5375ff07bcb6451e45c09f23f010a4d051968896
Parents: d8a7b67
Author: Jimmy Xiang <jx...@cloudera.com>
Authored: Fri Oct 3 09:29:00 2014 -0700
Committer: Jimmy Xiang <jx...@cloudera.com>
Committed: Fri Oct 3 11:41:18 2014 -0700
----------------------------------------------------------------------
.../hadoop/hbase/master/AssignmentManager.java | 8 +++++++-
.../org/apache/hadoop/hbase/master/HMaster.java | 19 +++++++++++++++++--
.../hbase/master/balancer/BaseLoadBalancer.java | 2 +-
3 files changed, 25 insertions(+), 4 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hbase/blob/5375ff07/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 899cdc0..77c32c4 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
@@ -1377,6 +1377,9 @@ public class AssignmentManager {
// Reuse existing assignment info
Map<ServerName, List<HRegionInfo>> bulkPlan =
balancer.retainAssignment(regions, servers);
+ if (bulkPlan == null) {
+ throw new IOException("Unable to determine a plan to assign region(s)");
+ }
assign(regions.size(), servers.size(),
"retainAssignment=true", bulkPlan);
@@ -1404,8 +1407,11 @@ public class AssignmentManager {
// Generate a round-robin bulk assignment plan
Map<ServerName, List<HRegionInfo>> bulkPlan
= balancer.roundRobinAssignment(regions, servers);
- processFavoredNodes(regions);
+ if (bulkPlan == null) {
+ throw new IOException("Unable to determine a plan to assign region(s)");
+ }
+ processFavoredNodes(regions);
assign(regions.size(), servers.size(),
"round-robin=true", bulkPlan);
}
http://git-wip-us.apache.org/repos/asf/hbase/blob/5375ff07/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
index 3d474f2..eef0a09 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
@@ -1079,15 +1079,30 @@ public class HMaster extends HRegionServer implements MasterServices, Server {
final List<ServerName> destServers = this.serverManager.createDestinationServersList(
regionState.getServerName());
dest = balancer.randomAssignment(hri, destServers);
+ if (dest == null) {
+ LOG.debug("Unable to determine a plan to assign " + hri);
+ return;
+ }
} else {
dest = ServerName.valueOf(Bytes.toString(destServerName));
- if (dest.equals(regionState.getServerName())) {
+ if (dest.equals(serverName) && balancer instanceof BaseLoadBalancer
+ && !((BaseLoadBalancer)balancer).shouldBeOnMaster(hri)) {
+ // To avoid unnecessary region moving later by balancer. Don't put user
+ // regions on master. Regions on master could be put on other region
+ // server intentionally by test however.
LOG.debug("Skipping move of region " + hri.getRegionNameAsString()
- + " because region already assigned to the same server " + dest + ".");
+ + " to avoid unnecessary region moving later by load balancer,"
+ + " because it should not be on master");
return;
}
}
+ if (dest.equals(regionState.getServerName())) {
+ LOG.debug("Skipping move of region " + hri.getRegionNameAsString()
+ + " because region already assigned to the same server " + dest + ".");
+ return;
+ }
+
// Now we can do the move
RegionPlan rp = new RegionPlan(hri, regionState.getServerName(), dest);
http://git-wip-us.apache.org/repos/asf/hbase/blob/5375ff07/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java
index 43a1fb7..a5e110b 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java
@@ -858,7 +858,7 @@ public abstract class BaseLoadBalancer implements LoadBalancer {
* Check if a region belongs to some small system table.
* If so, it may be expected to be put on the master regionserver.
*/
- protected boolean shouldBeOnMaster(HRegionInfo region) {
+ public boolean shouldBeOnMaster(HRegionInfo region) {
return tablesOnMaster.contains(region.getTable().getNameAsString());
}