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

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


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

Branch: refs/heads/branch-2
Commit: 03e7b78260413ebc508b3415dbe9c14be6a361de
Parents: 3f1c867
Author: Xiang LI <[email protected]>
Authored: Wed Mar 14 01:08:26 2018 +0800
Committer: Andrew Purtell <[email protected]>
Committed: Fri Mar 16 18:01:01 2018 -0700

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


http://git-wip-us.apache.org/repos/asf/hbase/blob/03e7b782/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 392cbab..3182a61 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
@@ -127,17 +127,23 @@ public class RSGroupBasedLoadBalancer implements 
RSGroupableBalancer {
       regionPlans.add(new RegionPlan(regionInfo, serverName, null));
     }
     try {
-      List<RSGroupInfo> rsgi = rsGroupInfoManager.listRSGroups();
-      for (RSGroupInfo info: rsgi) {
+      // 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 : rsGroupInfoManager.listRSGroups()) {
         Map<ServerName, List<RegionInfo>> groupClusterState = new HashMap<>();
         Map<TableName, Map<ServerName, List<RegionInfo>>> groupClusterLoad = 
new HashMap<>();
-        for (Address sName : info.getServers()) {
-          for(ServerName curr: clusterState.keySet()) {
-            if(curr.getAddress().equals(sName)) {
-              groupClusterState.put(curr, correctedState.get(curr));
-            }
+        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<RegionInfo> regionsOnServer = correctedState.get(server);
+            groupClusterState.put(server, regionsOnServer);
+
+            processedServers.add(server);
           }
         }
+
         groupClusterLoad.put(HConstants.ENSEMBLE_TABLE_NAME, 
groupClusterState);
         this.internalBalancer.setClusterLoad(groupClusterLoad);
         List<RegionPlan> groupPlans = this.internalBalancer

Reply via email to