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

siddhant pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git


The following commit(s) were added to refs/heads/master by this push:
     new b29beb3364 HDDS-11350. NullPointerException thrown on checking 
container balancer status (#7134)
b29beb3364 is described below

commit b29beb3364a72f49e62ced6edd34b7f49ad3eab4
Author: Siddhant Sangwan <[email protected]>
AuthorDate: Wed Sep 4 11:08:48 2024 +0530

    HDDS-11350. NullPointerException thrown on checking container balancer 
status (#7134)
---
 .../container/balancer/ContainerBalancerTask.java  | 17 ++++++-------
 .../hdds/scm/container/balancer/MockedSCM.java     |  2 +-
 .../balancer/TestContainerBalancerStatusInfo.java  | 28 ++++++++++++++++++++++
 3 files changed, 38 insertions(+), 9 deletions(-)

diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancerTask.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancerTask.java
index 7fea44671f..19a2f3c2e6 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancerTask.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancerTask.java
@@ -158,6 +158,14 @@ public class ContainerBalancerTask implements Runnable {
     this.selectedSources = new HashSet<>();
     this.selectedTargets = new HashSet<>();
     findSourceStrategy = new FindSourceGreedy(nodeManager);
+    if (config.getNetworkTopologyEnable()) {
+      findTargetStrategy = new FindTargetGreedyByNetworkTopology(
+          containerManager, placementPolicyValidateProxy,
+          nodeManager, networkTopology);
+    } else {
+      findTargetStrategy = new FindTargetGreedyByUsageInfo(containerManager,
+          placementPolicyValidateProxy, nodeManager);
+    }
     this.iterationsStatistic = new ArrayList<>();
   }
 
@@ -432,14 +440,7 @@ public class ContainerBalancerTask implements Runnable {
     this.maxDatanodesRatioToInvolvePerIteration =
         config.getMaxDatanodesRatioToInvolvePerIteration();
     this.maxSizeToMovePerIteration = config.getMaxSizeToMovePerIteration();
-    if (config.getNetworkTopologyEnable()) {
-      findTargetStrategy = new FindTargetGreedyByNetworkTopology(
-          containerManager, placementPolicyValidateProxy,
-          nodeManager, networkTopology);
-    } else {
-      findTargetStrategy = new FindTargetGreedyByUsageInfo(containerManager,
-          placementPolicyValidateProxy, nodeManager);
-    }
+
     this.excludeNodes = config.getExcludeNodes();
     this.includeNodes = config.getIncludeNodes();
     // include/exclude nodes from balancing according to configs
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/balancer/MockedSCM.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/balancer/MockedSCM.java
index a3ec55d586..0972e57df6 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/balancer/MockedSCM.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/balancer/MockedSCM.java
@@ -86,7 +86,7 @@ public final class MockedSCM {
     }
   }
 
-  private void init(@Nonnull ContainerBalancerConfiguration balancerConfig, 
@Nonnull OzoneConfiguration ozoneCfg) {
+  void init(@Nonnull ContainerBalancerConfiguration balancerConfig, @Nonnull 
OzoneConfiguration ozoneCfg) {
     ozoneCfg.setFromObject(balancerConfig);
     try {
       doMock(balancerConfig, ozoneCfg);
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/balancer/TestContainerBalancerStatusInfo.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/balancer/TestContainerBalancerStatusInfo.java
index b8ac648e84..48b3ee2d0d 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/balancer/TestContainerBalancerStatusInfo.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/balancer/TestContainerBalancerStatusInfo.java
@@ -19,7 +19,9 @@
 package org.apache.hadoop.hdds.scm.container.balancer;
 
 import org.apache.hadoop.hdds.conf.OzoneConfiguration;
+import org.apache.hadoop.hdds.scm.server.StorageContainerManager;
 import org.apache.hadoop.ozone.OzoneConsts;
+import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
 import java.util.List;
@@ -55,4 +57,30 @@ class TestContainerBalancerStatusInfo {
     });
 
   }
+
+  /**
+   * @see <a 
href="https://issues.apache.org/jira/browse/HDDS-11350";>HDDS-11350</a>
+   */
+  @Test
+  void 
testGetCurrentIterationsStatisticDoesNotThrowNullPointerExceptionWhenBalancingThreadIsSleeping()
 {
+    MockedSCM mockedScm = new MockedSCM(new TestableCluster(10, 
OzoneConsts.GB));
+    OzoneConfiguration ozoneConfig = new OzoneConfiguration();
+    ContainerBalancerConfiguration config = 
ozoneConfig.getObject(ContainerBalancerConfiguration.class);
+
+    config.setIterations(2);
+    // the following config makes the balancing thread go to sleep while 
waiting for DU to be triggered in DNs and
+    // updated storage reports to arrive via DN heartbeats - of course, this 
is a unit test and NodeManager, DNs etc.
+    // are all mocked
+    config.setTriggerDuEnable(true);
+    mockedScm.init(config, ozoneConfig);
+
+    // run ContainerBalancerTask in a new thread and have the current thread 
call getCurrentIterationsStatistic
+    StorageContainerManager scm = mockedScm.getStorageContainerManager();
+    ContainerBalancer cb = new ContainerBalancer(scm);
+    ContainerBalancerTask task = new ContainerBalancerTask(scm, 0, cb, 
cb.getMetrics(), config, false);
+    Thread thread = new Thread(task);
+    thread.setDaemon(true);
+    thread.start();
+    Assertions.assertDoesNotThrow(task::getCurrentIterationsStatistic);
+  }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to