From cfaf570f35bd7c6a790179be1b5cd18f41a18f79 Mon Sep 17 00:00:00 2001 From: Deepak Jain Date: Mon, 9 Mar 2026 08:47:36 -0700 Subject: [PATCH] HDFS-17872. Propagate tolerancePercentage to DataNode in DiskBalancer plan. --- .../diskbalancer/command/PlanCommand.java | 9 +++++++- .../diskbalancer/planner/TestNodePlan.java | 23 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/diskbalancer/command/PlanCommand.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/diskbalancer/command/PlanCommand.java index 3732de86aa0fc..928fe748e0232 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/diskbalancer/command/PlanCommand.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/diskbalancer/command/PlanCommand.java @@ -250,11 +250,16 @@ static private void printToScreen(List plans) { } /** - * Sets user specified plan parameters. + * Sets user specified plan parameters (bandwidth, maxError, tolerancePercent). + * tolerancePercent is read from config so the plan propagated to the DataNode + * uses the same value (HDFS-17872). * * @param plans - list of plans. */ private void setPlanParams(List plans) { + int tolerancePercent = getConf().getInt( + DFSConfigKeys.DFS_DISK_BALANCER_BLOCK_TOLERANCE, + DFSConfigKeys.DFS_DISK_BALANCER_BLOCK_TOLERANCE_DEFAULT); for (NodePlan plan : plans) { for (Step step : plan.getVolumeSetPlans()) { if (this.bandwidth > 0) { @@ -265,6 +270,8 @@ private void setPlanParams(List plans) { LOG.debug("Setting max error to {}", this.maxError); step.setMaxDiskErrors(this.maxError); } + LOG.debug("Setting tolerance percent to {}", tolerancePercent); + step.setTolerancePercent(tolerancePercent); } } } diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/diskbalancer/planner/TestNodePlan.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/diskbalancer/planner/TestNodePlan.java index 94a0beda261cd..1c4eb50969b97 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/diskbalancer/planner/TestNodePlan.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/diskbalancer/planner/TestNodePlan.java @@ -43,6 +43,29 @@ public void testNodePlan() throws IOException { assertThat(NodePlan.parseJson(json)).isNotNull(); } + /** + * HDFS-17872: Plan steps must carry tolerancePercent so the DataNode receives + * it. Verify serialization round-trip preserves tolerance percent. + */ + @Test + public void testPlanStepTolerancePercentInJson() throws IOException { + NodePlan nodePlan = new NodePlan("datanode1", 50070); + MoveStep moveStep = new MoveStep(); + moveStep.setBandwidth(100); + moveStep.setBytesToMove(1024); + moveStep.setIdealStorage(0.5); + moveStep.setMaxDiskErrors(5); + moveStep.setTolerancePercent(15); + moveStep.setVolumeSetID("volumeSetId"); + nodePlan.addStep(moveStep); + String json = nodePlan.toJson(); + NodePlan parsed = NodePlan.parseJson(json); + assertThat(parsed.getVolumeSetPlans()).hasSize(1); + assertThat(parsed.getVolumeSetPlans().get(0).getTolerancePercent()) + .describedAs("tolerancePercent should be propagated in plan JSON") + .isEqualTo(15); + } + @Test public void testNodePlanWithDisallowedStep() throws Exception { NodePlan nodePlan = new NodePlan("datanode1234", 1234);