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 226dee7..9c43fc3 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 @@ -262,6 +262,8 @@ public class StochasticLoadBalancer extends BaseLoadBalancer { return false; } + // small value for judging whether double variable is close to 0 + static final double EPSILON = 0.000000000000001D; @Override protected boolean needsBalance(Cluster cluster) { ClusterLoadState cs = new ClusterLoadState(cluster.clusterState); @@ -283,8 +285,14 @@ public class StochasticLoadBalancer extends BaseLoadBalancer { if (multiplier <= 0) { continue; } - sumMultiplier += multiplier; - total += c.cost() * multiplier; + double cost = c.cost(); + double d = cost * multiplier; + if (d >= EPSILON) { + sumMultiplier += multiplier; + } else { + LOG.debug("ignoring " + c.getClass() + " with multiplier " + multiplier); + } + total += d; } if (total <= 0 || sumMultiplier <= 0 diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancer.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancer.java index ba030c8..109a898 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancer.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancer.java @@ -96,7 +96,7 @@ public class TestStochasticLoadBalancer extends BalancerTestBase { @Test public void testNeedBalance() { - conf.setFloat("hbase.master.balancer.stochastic.minCostNeedBalance", 1.0f); + conf.setFloat("hbase.master.balancer.stochastic.minCostNeedBalance", 1.01f); loadBalancer.setConf(conf); for (int[] mockCluster : clusterStateMocks) { Map> servers = mockClusterServers(mockCluster);