You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by zh...@apache.org on 2021/03/15 13:50:11 UTC

[hbase] branch branch-2 updated: HBASE-25635 CandidateGenerator may miss some region balance actions (#3024)

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

zhangduo 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 95e8ee5  HBASE-25635 CandidateGenerator may miss some region balance actions (#3024)
95e8ee5 is described below

commit 95e8ee5ca5b9b92061ce21004a48a0f24ee2eafd
Author: haxiaolin <li...@gmail.com>
AuthorDate: Mon Mar 15 21:28:22 2021 +0800

    HBASE-25635 CandidateGenerator may miss some region balance actions (#3024)
    
    Signed-off-by: Viraj Jasani <vj...@apache.org>
    Signed-off-by: Duo Zhang <zh...@apache.org>
---
 .../hbase/master/balancer/CandidateGenerator.java  |  6 +++---
 .../master/balancer/StochasticLoadBalancer.java    |  7 +++++++
 ...estStochasticLoadBalancerHeterogeneousCost.java | 23 ++++++++++++++++++++++
 3 files changed, 33 insertions(+), 3 deletions(-)

diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/CandidateGenerator.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/CandidateGenerator.java
index 77bbcf9..e74e865 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/CandidateGenerator.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/CandidateGenerator.java
@@ -124,12 +124,12 @@ abstract class CandidateGenerator {
     if (fromServer < 0 || toServer < 0) {
       return BaseLoadBalancer.Cluster.NullAction;
     }
-    if (fromRegion > 0 && toRegion > 0) {
+    if (fromRegion >= 0 && toRegion >= 0) {
       return new BaseLoadBalancer.Cluster.SwapRegionsAction(fromServer, fromRegion,
         toServer, toRegion);
-    } else if (fromRegion > 0) {
+    } else if (fromRegion >= 0) {
       return new BaseLoadBalancer.Cluster.MoveRegionAction(fromRegion, fromServer, toServer);
-    } else if (toRegion > 0) {
+    } else if (toRegion >= 0) {
       return new BaseLoadBalancer.Cluster.MoveRegionAction(toRegion, toServer, fromServer);
     } else {
       return BaseLoadBalancer.Cluster.NullAction;
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.java
index 355960f..97eb148 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.java
@@ -261,6 +261,13 @@ public class StochasticLoadBalancer extends BaseLoadBalancer {
     this.candidateGenerators = customCandidateGenerators;
   }
 
+  /**
+   * Exposed for Testing!
+   */
+  public List<CandidateGenerator> getCandidateGenerators() {
+    return this.candidateGenerators;
+  }
+
   @Override
   protected void setSlop(Configuration conf) {
     this.slop = conf.getFloat("hbase.regions.slop", 0.001F);
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerHeterogeneousCost.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerHeterogeneousCost.java
index e355678..066e22a 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerHeterogeneousCost.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerHeterogeneousCost.java
@@ -76,6 +76,7 @@ public class TestStochasticLoadBalancerHeterogeneousCost extends BalancerTestBas
       RULES_FILE);
     BalancerTestBase.loadBalancer = new StochasticLoadBalancer();
     BalancerTestBase.loadBalancer.setConf(BalancerTestBase.conf);
+    BalancerTestBase.loadBalancer.getCandidateGenerators().add(new FairRandomCandidateGenerator());
   }
 
   @Test
@@ -279,4 +280,26 @@ public class TestStochasticLoadBalancerHeterogeneousCost extends BalancerTestBas
     ServerName sn = ServerName.valueOf(host, port, startCode);
     return new ServerAndLoad(sn, 0);
   }
+
+  static class FairRandomCandidateGenerator extends
+    StochasticLoadBalancer.RandomCandidateGenerator {
+
+    @Override
+    public BaseLoadBalancer.Cluster.Action pickRandomRegions(BaseLoadBalancer.Cluster cluster,
+      int thisServer, int otherServer) {
+      if (thisServer < 0 || otherServer < 0) {
+        return BaseLoadBalancer.Cluster.NullAction;
+      }
+
+      int thisRegion = pickRandomRegion(cluster, thisServer, 0.5);
+      int otherRegion = pickRandomRegion(cluster, otherServer, 0.5);
+
+      return getAction(thisServer, thisRegion, otherServer, otherRegion);
+    }
+
+    @Override
+    BaseLoadBalancer.Cluster.Action generate(BaseLoadBalancer.Cluster cluster) {
+      return super.generate(cluster);
+    }
+  }
 }