From 73d9de91ab7ffc25638521aeffc590a0eca533f6 Mon Sep 17 00:00:00 2001
From: Ray Mattingly <rmattingly@apache.org>
Date: Tue, 28 Jan 2025 15:28:39 -0500
Subject: [PATCH] HBASE-29073 StochasticLoadBalancer will always run the
 balancer on startup because of uninitialized sumMultiplier (#6641)

Co-authored-by: Ray Mattingly <rmattingly@hubspot.com>
Signed-off-by: Nick Dimiduk <ndimiduk@apache.org>
---
 .../hbase/master/balancer/StochasticLoadBalancer.java    | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

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 017625a715e3..fca4ef952073 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
@@ -442,14 +442,16 @@ boolean needsBalance(TableName tableName, BalancerClusterState cluster) {
     }
 
     double total = 0.0;
+    float localSumMultiplier = 0; // in case this.sumMultiplier is not initialized
     for (CostFunction c : costFunctions) {
       if (!c.isNeeded()) {
         LOG.trace("{} not needed", c.getClass().getSimpleName());
         continue;
       }
       total += c.cost() * c.getMultiplier();
+      localSumMultiplier += c.getMultiplier();
     }
-
+    sumMultiplier = localSumMultiplier;
     boolean balanced = (total / sumMultiplier < minCostNeedBalance);
     if (balanced) {
       if (isBalancerRejectionRecording) {
@@ -583,12 +585,13 @@ protected List<RegionPlan> balanceTable(TableName tableName,
     long startTime = EnvironmentEdgeManager.currentTime();
 
     initCosts(cluster);
-    sumMultiplier = 0;
+    float localSumMultiplier = 0;
     for (CostFunction c : costFunctions) {
       if (c.isNeeded()) {
-        sumMultiplier += c.getMultiplier();
+        localSumMultiplier += c.getMultiplier();
       }
     }
+    sumMultiplier = localSumMultiplier;
     if (sumMultiplier <= 0) {
       LOG.error("At least one cost function needs a multiplier > 0. For example, set "
         + "hbase.master.balancer.stochastic.regionCountCost to a positive value or default");