diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/diskbalancer/DiskBalancerService.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/diskbalancer/DiskBalancerService.java index b1bac677178..c68e63b3b71 100644 --- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/diskbalancer/DiskBalancerService.java +++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/diskbalancer/DiskBalancerService.java @@ -243,18 +243,16 @@ private void loadDiskBalancerInfo() throws IOException { private void applyDiskBalancerInfo(DiskBalancerInfo diskBalancerInfo) throws IOException { - // verify ContainerStates first - DiskBalancerConfiguration validated = new DiskBalancerConfiguration(); - validated.setContainerStates(diskBalancerInfo.getContainerStates()); + DiskBalancerConfiguration validated = diskBalancerInfo.toConfiguration(); // First store in local file, then update in memory variables writeDiskBalancerInfoTo(diskBalancerInfo, diskBalancerInfoFile); updateOperationalStateFromInfo(diskBalancerInfo); - setThreshold(diskBalancerInfo.getThreshold()); - setBandwidthInMB(diskBalancerInfo.getBandwidthInMB()); - setParallelThread(diskBalancerInfo.getParallelThread()); - setStopAfterDiskEven(diskBalancerInfo.isStopAfterDiskEven()); + setThreshold(validated.getThreshold()); + setBandwidthInMB(validated.getDiskBandwidthInMB()); + setParallelThread(validated.getParallelThread()); + setStopAfterDiskEven(validated.isStopAfterDiskEven()); setVersion(diskBalancerInfo.getVersion()); setContainerStates(validated.getMovableContainerStates()); diff --git a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/diskbalancer/TestDiskBalancerService.java b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/diskbalancer/TestDiskBalancerService.java index 425733cb9e2..f50cd1043b0 100644 --- a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/diskbalancer/TestDiskBalancerService.java +++ b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/diskbalancer/TestDiskBalancerService.java @@ -199,6 +199,38 @@ public void testUpdateService(ContainerTestVersionInfo versionInfo) throws Excep svc.shutdown(); } + @ParameterizedTest + @MethodSource("invalidDiskBalancerInfo") + public void testRefreshRejectsInvalidDiskBalancerInfo( + ContainerTestVersionInfo versionInfo, DiskBalancerInfo diskBalancerInfo) + throws Exception { + setLayoutAndSchemaForTest(versionInfo); + ContainerSet containerSet = ContainerSet.newReadOnlyContainerSet(1000); + ContainerMetrics metrics = ContainerMetrics.create(conf); + KeyValueHandler keyValueHandler = + new KeyValueHandler(conf, datanodeUuid, containerSet, volumeSet, + metrics, c -> { + }, new ContainerChecksumTreeManager(conf)); + DiskBalancerServiceTestImpl svc = + getDiskBalancerService(containerSet, conf, keyValueHandler, null, 1); + + assertThrows(IllegalArgumentException.class, + () -> svc.refresh(diskBalancerInfo)); + + svc.shutdown(); + } + + public static Stream invalidDiskBalancerInfo() { + return ContainerTestVersionInfo.getLayoutList().stream() + .flatMap(versionInfo -> Stream.of( + Arguments.arguments(versionInfo, new DiskBalancerInfo( + DiskBalancerRunningStatus.RUNNING, 0.0d, 100L, 5, true)), + Arguments.arguments(versionInfo, new DiskBalancerInfo( + DiskBalancerRunningStatus.RUNNING, 10.0d, 0L, 5, true)), + Arguments.arguments(versionInfo, new DiskBalancerInfo( + DiskBalancerRunningStatus.RUNNING, 10.0d, 100L, 0, true)))); + } + @ContainerTestVersionInfo.ContainerTest public void testPolicyClassInitialization(ContainerTestVersionInfo versionInfo) throws IOException { setLayoutAndSchemaForTest(versionInfo);