From ffb463ea0e6774bafdf475b5bcde12043c3d33e5 Mon Sep 17 00:00:00 2001 From: slfan1989 Date: Sun, 24 May 2026 17:07:23 +0800 Subject: [PATCH 1/3] HDDS-15362. [DiskBalancer] Handle zero-capacity volumes in status report. --- .../container/diskbalancer/DiskBalancerService.java | 4 +++- .../TestDiskBalancerVolumeCalculation.java | 11 +++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) 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 70d3e8598d4..b15d332ec49 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 @@ -743,13 +743,15 @@ public static List buildVolumeReportProto(List result = new ArrayList<>(); for (VolumeFixedUsage v : volumeSet) { HddsVolume volume = v.getVolume(); + double utilization = v.getUsage().getCapacity() == 0 + ? 0.0 : v.getUtilization(); VolumeReportProto.Builder builder = VolumeReportProto.newBuilder() .setStorageId(volume.getStorageID()) .setTotalCapacity(v.getUsage().getCapacity()) .setUsedSpace(v.getUsage().getUsedSpace()) .setCommittedBytes(volume.getCommittedBytes()) .setEffectiveUsedSpace(v.getEffectiveUsed()) - .setUtilization(v.getUtilization()); + .setUtilization(utilization); if (volume.getStorageDir() != null) { builder.setStoragePath(volume.getStorageDir().getPath()); } diff --git a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/diskbalancer/TestDiskBalancerVolumeCalculation.java b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/diskbalancer/TestDiskBalancerVolumeCalculation.java index a32da8a3de9..7551f01d694 100644 --- a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/diskbalancer/TestDiskBalancerVolumeCalculation.java +++ b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/diskbalancer/TestDiskBalancerVolumeCalculation.java @@ -83,6 +83,17 @@ void calculateVolumeDataDensityIgnoresZeroCapacityVolumes() Arrays.asList(zeroCapacity, lowUsage, highUsage)), 0.0); } + @Test + void buildVolumeReportProtoReportsZeroUtilizationForZeroCapacityVolume() + throws IOException { + HddsVolume volume = createVolume("zero-capacity-report", 0, 0); + + assertEquals(0.0, DiskBalancerService.buildVolumeReportProto( + Collections.singletonList( + DiskBalancerVolumeCalculation.newVolumeFixedUsage(volume, null))) + .get(0).getUtilization()); + } + @Test void getIdealUsageRejectsNegativeCapacity() throws IOException { HddsVolume negativeCapacityVolume = createVolume( From cb0ae23abe59d09200096cb40efadc2d6574cb08 Mon Sep 17 00:00:00 2001 From: slfan1989 Date: Mon, 25 May 2026 16:21:48 +0800 Subject: [PATCH 2/3] HDDS-15346. DiskBalancer should update delta sizes atomically. --- .../container/diskbalancer/DiskBalancerService.java | 4 +--- .../diskbalancer/DiskBalancerVolumeCalculation.java | 9 +++++---- .../TestDiskBalancerVolumeCalculation.java | 13 +++++++++++-- 3 files changed, 17 insertions(+), 9 deletions(-) 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 b15d332ec49..70d3e8598d4 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 @@ -743,15 +743,13 @@ public static List buildVolumeReportProto(List result = new ArrayList<>(); for (VolumeFixedUsage v : volumeSet) { HddsVolume volume = v.getVolume(); - double utilization = v.getUsage().getCapacity() == 0 - ? 0.0 : v.getUtilization(); VolumeReportProto.Builder builder = VolumeReportProto.newBuilder() .setStorageId(volume.getStorageID()) .setTotalCapacity(v.getUsage().getCapacity()) .setUsedSpace(v.getUsage().getUsedSpace()) .setCommittedBytes(volume.getCommittedBytes()) .setEffectiveUsedSpace(v.getEffectiveUsed()) - .setUtilization(utilization); + .setUtilization(v.getUtilization()); if (volume.getStorageDir() != null) { builder.setStoragePath(volume.getStorageDir().getPath()); } diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/diskbalancer/DiskBalancerVolumeCalculation.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/diskbalancer/DiskBalancerVolumeCalculation.java index 6e6d662f14d..db55762712b 100644 --- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/diskbalancer/DiskBalancerVolumeCalculation.java +++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/diskbalancer/DiskBalancerVolumeCalculation.java @@ -22,7 +22,6 @@ import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.stream.Collectors; import org.apache.hadoop.hdds.fs.SpaceUsageSource; import org.apache.hadoop.ozone.container.common.volume.HddsVolume; @@ -167,13 +166,15 @@ public static final class VolumeFixedUsage { private final HddsVolume volume; private final SpaceUsageSource.Fixed usage; private final long effectiveUsed; - private final Double utilization; + private final double utilization; private VolumeFixedUsage(HddsVolume volume, long delta) { this.volume = volume; this.usage = volume.getCurrentUsage(); this.effectiveUsed = computeEffectiveUsage(usage, volume.getCommittedBytes(), delta); - this.utilization = usage.getCapacity() > 0 ? computeUtilization(usage, volume.getCommittedBytes(), delta) : null; + this.utilization = usage.getCapacity() > 0 + ? computeUtilization(usage, volume.getCommittedBytes(), delta) + : 1.0; } public HddsVolume getVolume() { @@ -189,7 +190,7 @@ public long getEffectiveUsed() { } public double getUtilization() { - return Objects.requireNonNull(utilization, "utilization == null"); + return utilization; } public long computeUsableSpace() { diff --git a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/diskbalancer/TestDiskBalancerVolumeCalculation.java b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/diskbalancer/TestDiskBalancerVolumeCalculation.java index 7551f01d694..e7e444bda34 100644 --- a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/diskbalancer/TestDiskBalancerVolumeCalculation.java +++ b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/diskbalancer/TestDiskBalancerVolumeCalculation.java @@ -84,11 +84,20 @@ void calculateVolumeDataDensityIgnoresZeroCapacityVolumes() } @Test - void buildVolumeReportProtoReportsZeroUtilizationForZeroCapacityVolume() + void getUtilizationReturnsFullUtilizationForZeroCapacityVolume() + throws IOException { + HddsVolume volume = createVolume("zero-capacity-utilization", 0, 0); + + assertEquals(1.0, DiskBalancerVolumeCalculation.newVolumeFixedUsage( + volume, null).getUtilization()); + } + + @Test + void buildVolumeReportProtoReportsFullUtilizationForZeroCapacityVolume() throws IOException { HddsVolume volume = createVolume("zero-capacity-report", 0, 0); - assertEquals(0.0, DiskBalancerService.buildVolumeReportProto( + assertEquals(1.0, DiskBalancerService.buildVolumeReportProto( Collections.singletonList( DiskBalancerVolumeCalculation.newVolumeFixedUsage(volume, null))) .get(0).getUtilization()); From ab9e826b7156cf4096ea803f1ae5f20a795e70a1 Mon Sep 17 00:00:00 2001 From: slfan1989 Date: Wed, 27 May 2026 20:45:20 +0800 Subject: [PATCH 3/3] HDDS-15362. [DiskBalancer] Handle zero-capacity volumes in status report. --- .../diskbalancer/DiskBalancerVolumeCalculation.java | 2 +- .../diskbalancer/TestDiskBalancerVolumeCalculation.java | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/diskbalancer/DiskBalancerVolumeCalculation.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/diskbalancer/DiskBalancerVolumeCalculation.java index db55762712b..071e43c5187 100644 --- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/diskbalancer/DiskBalancerVolumeCalculation.java +++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/diskbalancer/DiskBalancerVolumeCalculation.java @@ -174,7 +174,7 @@ private VolumeFixedUsage(HddsVolume volume, long delta) { this.effectiveUsed = computeEffectiveUsage(usage, volume.getCommittedBytes(), delta); this.utilization = usage.getCapacity() > 0 ? computeUtilization(usage, volume.getCommittedBytes(), delta) - : 1.0; + : 0.0; } public HddsVolume getVolume() { diff --git a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/diskbalancer/TestDiskBalancerVolumeCalculation.java b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/diskbalancer/TestDiskBalancerVolumeCalculation.java index e7e444bda34..4289af7afb7 100644 --- a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/diskbalancer/TestDiskBalancerVolumeCalculation.java +++ b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/diskbalancer/TestDiskBalancerVolumeCalculation.java @@ -84,20 +84,20 @@ void calculateVolumeDataDensityIgnoresZeroCapacityVolumes() } @Test - void getUtilizationReturnsFullUtilizationForZeroCapacityVolume() + void getUtilizationReturnsZeroForZeroCapacityVolume() throws IOException { HddsVolume volume = createVolume("zero-capacity-utilization", 0, 0); - assertEquals(1.0, DiskBalancerVolumeCalculation.newVolumeFixedUsage( + assertEquals(0.0, DiskBalancerVolumeCalculation.newVolumeFixedUsage( volume, null).getUtilization()); } @Test - void buildVolumeReportProtoReportsFullUtilizationForZeroCapacityVolume() + void buildVolumeReportProtoReportsZeroUtilizationForZeroCapacityVolume() throws IOException { HddsVolume volume = createVolume("zero-capacity-report", 0, 0); - assertEquals(1.0, DiskBalancerService.buildVolumeReportProto( + assertEquals(0.0, DiskBalancerService.buildVolumeReportProto( Collections.singletonList( DiskBalancerVolumeCalculation.newVolumeFixedUsage(volume, null))) .get(0).getUtilization());