diff --git a/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java b/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java
index 5e5112856a7e..bca2cd1bc578 100644
--- a/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java
+++ b/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java
@@ -274,6 +274,21 @@ public ServerName randomAssignment(HRegionInfo region,
return this.internalBalancer.randomAssignment(region, filteredServers);
}
+ @Override
+ public Set
getServersInDefaultOrGroup(HRegionInfo region) throws HBaseIOException {
+ try{
+ String groupName = infoManager.getRSGroupOfTable(region.getTable());
+ if (groupName == null) {
+ groupName = RSGroupInfo.DEFAULT_GROUP;
+ }
+ RSGroupInfo info = infoManager.getRSGroup(groupName);
+ Set serversInGroup = info.getServers();
+ return serversInGroup;
+ } catch (Exception e) {
+ throw new HBaseIOException("Failed to get servers ", e);
+ }
+ }
+
private void generateGroupMaps(
List regions,
List servers,
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 4d7c0301b066..861fb7b19452 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
@@ -89,6 +89,7 @@
import org.apache.hadoop.hbase.master.handler.DisableTableHandler;
import org.apache.hadoop.hbase.master.handler.EnableTableHandler;
import org.apache.hadoop.hbase.master.handler.OpenedRegionHandler;
+import org.apache.hadoop.hbase.net.Address;
import org.apache.hadoop.hbase.protobuf.generated.RegionServerStatusProtos.RegionStateTransition;
import org.apache.hadoop.hbase.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode;
import org.apache.hadoop.hbase.protobuf.generated.ZooKeeperProtos;
@@ -2636,10 +2637,28 @@ public void run() {
for (ServerName server : getExcludedServersForSystemTable()) {
regionsShouldMove.addAll(getCarryingSystemTables(server));
}
+ Set remainservers = new HashSet<>();
if (!regionsShouldMove.isEmpty()) {
List plans = new ArrayList<>();
+ List names = getExcludedServersForSystemTable();
for (HRegionInfo regionInfo : regionsShouldMove) {
RegionPlan plan = getRegionPlan(regionInfo, true);
+ Set serverbygroup = balancer.getServersInDefaultOrGroup(regionInfo);
+ Set excludedAddresses = getAddressFromServerName(names);
+ if (serverbygroup != null) {
+ for (Address address : serverbygroup) {
+ if (!excludedAddresses.contains(address) &&
+ getAddressFromServerName(serverManager.
+ getOnlineServersList()).contains(address)) {
+ remainservers.add(address);
+ }
+ }
+ if (remainservers.size() == 0) {
+ LOG.info("The region("+regionInfo.getRegionNameAsString()+")" +
+ "do not need to move to RS with the highest version ");
+ continue;
+ }
+ }
if (regionInfo.isMetaRegion()) {
// Must move meta region first.
balance(plan);
@@ -2659,6 +2678,16 @@ public void run() {
}).start();
}
+ public HashSet getAddressFromServerName(List servernames) {
+ HashSet addresses = new HashSet<>();
+ if (servernames == null) {
+ return addresses;
+ }
+ for (ServerName servername : servernames) {
+ addresses.add(servername.getAddress());
+ }
+ return addresses;
+ }
/**
* Unassigns the specified region.
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/LoadBalancer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/LoadBalancer.java
index c8121b98c22d..e03c390172c4 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/LoadBalancer.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/LoadBalancer.java
@@ -20,6 +20,7 @@
import java.util.List;
import java.util.Map;
+import java.util.Set;
import org.apache.hadoop.hbase.classification.InterfaceAudience;
import org.apache.hadoop.hbase.conf.ConfigurationObserver;
@@ -31,6 +32,7 @@
import org.apache.hadoop.hbase.ServerName;
import org.apache.hadoop.hbase.Stoppable;
import org.apache.hadoop.hbase.TableName;
+import org.apache.hadoop.hbase.net.Address;
/**
* Makes decisions about the placement and movement of Regions across
@@ -127,6 +129,14 @@ ServerName randomAssignment(
HRegionInfo regionInfo, List servers
) throws HBaseIOException;
+ /**
+ * Get all the servers of this region's rs_group,and now only used in RSGroupBasedLoadBalancer
+ * @param region Get the servers of region's table
+ * @return Set of Address
+ */
+ Set getServersInDefaultOrGroup(
+ HRegionInfo region) throws HBaseIOException;
+
/**
* Initialize the load balancer. Must be called after setters.
* @throws HBaseIOException
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/FavoredNodeLoadBalancer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/FavoredNodeLoadBalancer.java
index 32d9c6c0c4aa..f9a2c41879c1 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/FavoredNodeLoadBalancer.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/FavoredNodeLoadBalancer.java
@@ -19,10 +19,7 @@
package org.apache.hadoop.hbase.master.balancer;
import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -40,6 +37,7 @@
import org.apache.hadoop.hbase.master.ServerManager;
import org.apache.hadoop.hbase.master.SnapshotOfRegionAssignmentFromMeta;
import org.apache.hadoop.hbase.master.balancer.FavoredNodesPlan.Position;
+import org.apache.hadoop.hbase.net.Address;
import org.apache.hadoop.hbase.util.Pair;
/**
@@ -225,6 +223,11 @@ public ServerName randomAssignment(HRegionInfo regionInfo, List serv
}
}
+ @Override
+ public Set getServersInDefaultOrGroup(HRegionInfo region) throws HBaseIOException {
+ return null;
+ }
+
private Pair