You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by ra...@apache.org on 2018/09/18 05:59:53 UTC
hbase git commit: HBASE-21102 - ServerCrashProcedure should select
target server where no other replicas exist for the current region - fix
flaky test (Ram)
Repository: hbase
Updated Branches:
refs/heads/master 1cf920db4 -> cebb725a9
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/cebb725a
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/cebb725a
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/cebb725a
Branch: refs/heads/master
Commit: cebb725a9f4ab8dd9d3f306d21d53d6f56161c51
Parents: 1cf920d
Author: Vasudevan <ra...@intel.com>
Authored: Tue Sep 18 11:28:23 2018 +0530
Committer: Vasudevan <ra...@intel.com>
Committed: Tue Sep 18 11:28:23 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/cebb725a/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/cebb725a/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) {