You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by zg...@apache.org on 2020/03/11 02:41:02 UTC

[hbase] branch branch-2 updated: HBASE-23953 SimpleBalancer bug when second pass to fill up to min (#1262)

This is an automated email from the ASF dual-hosted git repository.

zghao pushed a commit to branch branch-2
in repository https://gitbox.apache.org/repos/asf/hbase.git


The following commit(s) were added to refs/heads/branch-2 by this push:
     new 6900a6b  HBASE-23953 SimpleBalancer bug when second pass to fill up to min (#1262)
6900a6b is described below

commit 6900a6bfde0feed03b4e6abb9b1ac3491b059de8
Author: niuyulin <ny...@163.com>
AuthorDate: Wed Mar 11 10:30:02 2020 +0800

    HBASE-23953 SimpleBalancer bug when second pass to fill up to min (#1262)
    
    Signed-off-by: Guanghao Zhang <zg...@apache.org>
---
 .../hbase/master/balancer/SimpleLoadBalancer.java  |  1 +
 .../hbase/master/balancer/BalancerTestBase.java    | 20 ++++++++++++++++
 .../master/balancer/TestDefaultLoadBalancer.java   | 27 ++++++++++++++++++++++
 3 files changed, 48 insertions(+)

diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.java
index d3ccda4..c0538b8 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.java
@@ -424,6 +424,7 @@ public class SimpleLoadBalancer extends BaseLoadBalancer {
         addRegionPlan(regionsToMove, fetchFromTail,
           server.getKey().getServerName(), regionsToReturn);
         numTaken++;
+        balanceInfo.setNumRegionsAdded(balanceInfo.getNumRegionsAdded() + 1);
       }
     }
 
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/BalancerTestBase.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/BalancerTestBase.java
index 0f6e51e..1528dfc 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/BalancerTestBase.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/BalancerTestBase.java
@@ -435,6 +435,26 @@ public class BalancerTestBase {
     return randomRegions(numRegions, -1);
   }
 
+  protected List<RegionInfo> createRegions(int numRegions, TableName tableName) {
+    List<RegionInfo> regions = new ArrayList<>(numRegions);
+    byte[] start = new byte[16];
+    byte[] end = new byte[16];
+    Random rand = ThreadLocalRandom.current();
+    rand.nextBytes(start);
+    rand.nextBytes(end);
+    for (int i = 0; i < numRegions; i++) {
+      Bytes.putInt(start, 0, numRegions << 1);
+      Bytes.putInt(end, 0, (numRegions << 1) + 1);
+      RegionInfo hri = RegionInfoBuilder.newBuilder(tableName)
+        .setStartKey(start)
+        .setEndKey(end)
+        .setSplit(false)
+        .build();
+      regions.add(hri);
+    }
+    return regions;
+  }
+
   protected List<RegionInfo> randomRegions(int numRegions, int numTables) {
     List<RegionInfo> regions = new ArrayList<>(numRegions);
     byte[] start = new byte[16];
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestDefaultLoadBalancer.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestDefaultLoadBalancer.java
index bad9781..ffbb6c0 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestDefaultLoadBalancer.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestDefaultLoadBalancer.java
@@ -17,6 +17,7 @@
  */
 package org.apache.hadoop.hbase.master.balancer;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
 import java.util.ArrayList;
@@ -209,4 +210,30 @@ public class TestDefaultLoadBalancer extends BalancerTestBase {
     List<ServerAndLoad> balancedCluster1 = reconcile(clusterList, clusterplans1, clusterServers);
     assertTrue(assertClusterOverallAsBalanced(balancedCluster1, clusterLoadPerTable.keySet().size()));
   }
+
+  @Test
+  public void
+  testBalanceClusterOverallStrictly() throws Exception {
+    int[] regionNumOfTable1PerServer = {3, 3, 4, 4, 4, 4, 5, 5, 5};
+    int[] regionNumOfTable2PerServer = {2, 2, 2, 2, 2, 2, 2, 2, 1};
+    TreeMap<ServerName, List<RegionInfo>> serverRegionInfo = new TreeMap<>();
+    List<ServerAndLoad> serverAndLoads = new ArrayList<>();
+    for (int i = 0; i < regionNumOfTable1PerServer.length; i++) {
+      ServerName serverName = ServerName.valueOf("server" + i, 1000, -1);
+      List<RegionInfo> regions1 = createRegions(regionNumOfTable1PerServer[i], TableName.valueOf("table1"));
+      List<RegionInfo> regions2 = createRegions(regionNumOfTable2PerServer[i], TableName.valueOf("table2"));
+      regions1.addAll(regions2);
+      serverRegionInfo.put(serverName, regions1);
+      ServerAndLoad serverAndLoad = new ServerAndLoad(serverName, regionNumOfTable1PerServer[i] + regionNumOfTable2PerServer[i]);
+      serverAndLoads.add(serverAndLoad);
+    }
+    HashMap<TableName, TreeMap<ServerName, List<RegionInfo>>> clusterLoadPerTable = mockClusterServersWithTables(serverRegionInfo);
+    loadBalancer.setClusterLoad((Map) clusterLoadPerTable);
+    List<RegionPlan> partialplans = loadBalancer.balanceCluster(clusterLoadPerTable.get(TableName.valueOf("table1")));
+    List<ServerAndLoad> balancedServerLoads = reconcile(serverAndLoads, partialplans, serverRegionInfo);
+    for (ServerAndLoad serverAndLoad : balancedServerLoads) {
+      assertEquals(6, serverAndLoad.getLoad());
+    }
+  }
+
 }