diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancer.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancer.java index 3dddd67bd8ad..2f6b8a7f814f 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancer.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancer.java @@ -183,17 +183,19 @@ public ContainerBalancerTask.Status getBalancerStatus() { * @return balancer status info if balancer started */ public ContainerBalancerStatusInfo getBalancerStatusInfo() throws IOException { - if (isBalancerRunning()) { - ContainerBalancerConfigurationProto configProto = readConfiguration(ContainerBalancerConfigurationProto.class); - return new ContainerBalancerStatusInfo( - this.startedAt, - configProto, - task.getCurrentIterationsStatistic() - ); - } else { + lock.lock(); + try { + if (isBalancerRunning()) { + return new ContainerBalancerStatusInfo( + this.startedAt, + config.toProtobufBuilder().setShouldRun(true).build(), + task.getCurrentIterationsStatistic() + ); + } return null; + } finally { + lock.unlock(); } - } /** * Checks if ContainerBalancer is in valid state to call stop. diff --git a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/balancer/TestContainerBalancer.java b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/balancer/TestContainerBalancer.java index 662322b42f55..c77928874715 100644 --- a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/balancer/TestContainerBalancer.java +++ b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/balancer/TestContainerBalancer.java @@ -44,6 +44,7 @@ import static org.apache.hadoop.hdds.HddsConfigKeys.HDDS_NODE_REPORT_INTERVAL; import static org.apache.hadoop.hdds.HddsConfigKeys.HDDS_SCM_WAIT_TIME_AFTER_SAFE_MODE_EXIT; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertThrowsExactly; import static org.junit.jupiter.api.Assertions.assertSame; @@ -257,6 +258,22 @@ public void testDelayedStartOnSCMStatusChange() stopBalancer(); } + @Test + public void testGetBalancerStatusInfo() throws Exception { + startBalancer(balancerConfiguration); + assertSame(ContainerBalancerTask.Status.RUNNING, containerBalancer.getBalancerStatus()); + + // Assert the configuration fields that were explicitly set + ContainerBalancerStatusInfo status = containerBalancer.getBalancerStatusInfo(); + assertEquals(balancerConfiguration.getThreshold(), + Double.parseDouble(status.getConfiguration().getUtilizationThreshold())); + assertEquals(balancerConfiguration.getIterations(), status.getConfiguration().getIterations()); + assertEquals(balancerConfiguration.getTriggerDuEnable(), status.getConfiguration().getTriggerDuBeforeMoveEnable()); + + stopBalancer(); + assertSame(ContainerBalancerTask.Status.STOPPED, containerBalancer.getBalancerStatus()); + } + private void startBalancer(ContainerBalancerConfiguration config) throws IllegalContainerBalancerStateException, IOException, InvalidContainerBalancerConfigurationException, TimeoutException { diff --git a/hadoop-ozone/dist/src/main/smoketest/balancer/testBalancer.robot b/hadoop-ozone/dist/src/main/smoketest/balancer/testBalancer.robot index 06d8a3416f00..e7be2a2b66f1 100644 --- a/hadoop-ozone/dist/src/main/smoketest/balancer/testBalancer.robot +++ b/hadoop-ozone/dist/src/main/smoketest/balancer/testBalancer.robot @@ -67,7 +67,6 @@ Run Container Balancer Wait Finish Of Balancing ${result} = Execute ozone admin containerbalancer status - Should Contain ${result} ContainerBalancer is Running. Wait Until Keyword Succeeds 6min 10sec ContainerBalancer is Not Running Sleep 60000ms