HBASE-20186 Improve RSGroupBasedLoadBalancer#balanceCluster() to be more 
efficient when calculating cluster state for each rsgroup

Signed-off-by: tedyu <[email protected]>

Conflicts:
        
hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/9fb473c0
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/9fb473c0
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/9fb473c0

Branch: refs/heads/branch-1.4
Commit: 9fb473c0e0f223c7085046edeab6f3ec28d67c49
Parents: 51a35aa
Author: Xiang LI <[email protected]>
Authored: Wed Mar 14 01:08:26 2018 +0800
Committer: Andrew Purtell <[email protected]>
Committed: Fri Mar 16 18:00:59 2018 -0700

----------------------------------------------------------------------
 .../hbase/rsgroup/RSGroupBasedLoadBalancer.java | 21 ++++++++++++--------
 1 file changed, 13 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/9fb473c0/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java
----------------------------------------------------------------------
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 529a7e6..9f8f427 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
@@ -135,16 +135,21 @@ public class RSGroupBasedLoadBalancer implements 
RSGroupableBalancer, LoadBalanc
       regionPlans.add(new RegionPlan(regionInfo, null, null));
     }
     try {
-      for (RSGroupInfo info : infoManager.listRSGroups()) {
-        Map<ServerName, List<HRegionInfo>> groupClusterState =
-            new HashMap<ServerName, List<HRegionInfo>>();
-        for (Address addr : info.getServers()) {
-          for(ServerName curr: clusterState.keySet()) {
-            if(curr.getAddress().equals(addr)) {
-              groupClusterState.put(curr, correctedState.get(curr));
-            }
+      // Record which region servers have been processed,so as to skip them 
after processed
+      HashSet<ServerName> processedServers = new HashSet<>();
+
+      // For each rsgroup
+      for (RSGroupInfo rsgroup : infoManager.listRSGroups()) {
+        Map<ServerName, List<HRegionInfo>> groupClusterState = new HashMap<>();
+        for (ServerName server : clusterState.keySet()) { // for each region 
server
+          if (!processedServers.contains(server) // server is not processed yet
+              && rsgroup.containsServer(server.getAddress())) { // server 
belongs to this rsgroup
+            List<HRegionInfo> regionsOnServer = correctedState.get(server);
+            groupClusterState.put(server, regionsOnServer);
+            processedServers.add(server);
           }
         }
+
         List<RegionPlan> groupPlans = this.internalBalancer
             .balanceCluster(groupClusterState);
         if (groupPlans != null) {

Reply via email to