diff --git a/hbase-balancer/src/main/java/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.java b/hbase-balancer/src/main/java/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.java index 6139fc055ebf..075d970fc69f 100644 --- a/hbase-balancer/src/main/java/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.java +++ b/hbase-balancer/src/main/java/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.java @@ -683,8 +683,12 @@ protected List balanceTable(TableName tableName, newCost = computeCost(cluster, currentCost); + double costImprovement = currentCost - newCost; + double minimumImprovement = + Math.max(CostFunction.getCostEpsilon(currentCost), CostFunction.getCostEpsilon(newCost)); + boolean costsImproved = costImprovement > minimumImprovement; boolean conditionalsSimilarCostsImproved = - (newCost < currentCost && conditionalViolationsChange == 0 && !isViolatingConditionals); + (costsImproved && conditionalViolationsChange == 0 && !isViolatingConditionals); // Our first priority is to reduce conditional violations // Our second priority is to reduce balancer cost // change, regardless of cost change