Repository: hbase Updated Branches: refs/heads/branch-2 6616fd2e0 -> 13581e527
HBASE-21102 - ServerCrashProcedure should select target server where no other replicas exist for the current region - fix flaky test (Ram) Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/13581e52 Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/13581e52 Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/13581e52 Branch: refs/heads/branch-2 Commit: 13581e527d7ead1684f5822320e1c148ef71a28a Parents: 6616fd2 Author: Vasudevan <ramkrishna.s.vasude...@intel.com> Authored: Tue Sep 18 11:28:23 2018 +0530 Committer: Vasudevan <ramkrishna.s.vasude...@intel.com> Committed: Tue Sep 18 11:30:49 2018 +0530 ---------------------------------------------------------------------- .../hbase/master/assignment/RegionStates.java | 22 ++++++++++++++++++++ .../hbase/master/balancer/BaseLoadBalancer.java | 17 +++++++++------ 2 files changed, 33 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/13581e52/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionStates.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionStates.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionStates.java index 847d4f0..2b9c0bd 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionStates.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionStates.java @@ -37,9 +37,11 @@ import org.apache.hadoop.hbase.HRegionLocation; import org.apache.hadoop.hbase.ServerName; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.RegionInfo; +import org.apache.hadoop.hbase.client.RegionReplicaUtil; import org.apache.hadoop.hbase.master.RegionState; import org.apache.hadoop.hbase.master.RegionState.State; import org.apache.hadoop.hbase.util.Bytes; +import org.apache.hadoop.hbase.util.ServerRegionReplicaUtil; import org.apache.yetus.audience.InterfaceAudience; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -772,6 +774,26 @@ public class RegionStates { return serverNode; } + public boolean isReplicaAvailableForRegion(final RegionInfo info) { + // if the region info itself is a replica return true. + if (!RegionReplicaUtil.isDefaultReplica(info)) { + return true; + } + // iterate the regionsMap for the given region name. If there are replicas it should + // list them in order. + for (RegionStateNode node : regionsMap.tailMap(info.getRegionName()).values()) { + if (!node.getTable().equals(info.getTable()) + || !ServerRegionReplicaUtil.isReplicasForSameRegion(info, node.getRegionInfo())) { + break; + } else if (!RegionReplicaUtil.isDefaultReplica(node.getRegionInfo())) { + // we have replicas + return true; + } + } + // we don have replicas + return false; + } + public ServerStateNode removeRegionFromServer(final ServerName serverName, final RegionStateNode regionNode) { ServerStateNode serverNode = getOrCreateServer(serverName); http://git-wip-us.apache.org/repos/asf/hbase/blob/13581e52/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 20b96ef..114aee4 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 @@ -34,6 +34,7 @@ import java.util.Set; import java.util.TreeMap; import java.util.function.Predicate; import java.util.stream.Collectors; + import org.apache.commons.lang3.NotImplementedException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.ClusterMetrics; @@ -51,15 +52,14 @@ import org.apache.hadoop.hbase.master.MasterServices; import org.apache.hadoop.hbase.master.RackManager; import org.apache.hadoop.hbase.master.RegionPlan; import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action.Type; -import org.apache.yetus.audience.InterfaceAudience; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting; import org.apache.hbase.thirdparty.com.google.common.base.Joiner; import org.apache.hbase.thirdparty.com.google.common.collect.ArrayListMultimap; import org.apache.hbase.thirdparty.com.google.common.collect.Lists; import org.apache.hbase.thirdparty.com.google.common.collect.Sets; +import org.apache.yetus.audience.InterfaceAudience; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * The base class for load balancers. It provides the the functions used to by @@ -1454,8 +1454,13 @@ public abstract class BaseLoadBalancer implements LoadBalancer { for (Map.Entry<RegionInfo, ServerName> entry : regions.entrySet()) { RegionInfo region = entry.getKey(); ServerName oldServerName = entry.getValue(); - if (!hasRegionReplica && !RegionReplicaUtil.isDefaultReplica(region)) { - hasRegionReplica = true; + // In the current set of regions even if one has region replica let us go with + // getting the entire snapshot + if (this.services != null && this.services.getAssignmentManager() != null) { // for tests + if (!hasRegionReplica && this.services.getAssignmentManager().getRegionStates() + .isReplicaAvailableForRegion(region)) { + hasRegionReplica = true; + } } List<ServerName> localServers = new ArrayList<>(); if (oldServerName != null) {