From 0e27bc2561ea28db0cc5350e91297aef428779de Mon Sep 17 00:00:00 2001 From: Anurag Parvatikar Date: Mon, 22 Jun 2026 12:45:20 +0530 Subject: [PATCH 1/2] HDDS-15446. Expose Hard Min Free Space Threshold via JMX --- .../ozone/container/common/volume/VolumeInfoMetrics.java | 5 +++++ .../src/main/resources/webapps/hddsDatanode/dn-overview.html | 2 ++ .../src/main/resources/webapps/hddsDatanode/dn.js | 1 + .../ozone/container/common/volume/TestVolumeInfoMetrics.java | 2 ++ 4 files changed, 10 insertions(+) diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/VolumeInfoMetrics.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/VolumeInfoMetrics.java index c6e17d5cfd58..c078c5d3b918 100644 --- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/VolumeInfoMetrics.java +++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/VolumeInfoMetrics.java @@ -61,6 +61,10 @@ public class VolumeInfoMetrics implements MetricsSource { Interns.info("MinFreeSpace", "Minimum free space threshold (soft limit) reported to SCM, " + "derived from hdds.datanode.volume.min.free.space.percent / hdds.datanode.volume.min.free.space"); + private static final MetricsInfo HARD_MIN_FREE_SPACE = + Interns.info("HardMinFreeSpace", + "Minimum free space threshold (hard limit) enforced locally for writes, " + + "derived from hdds.datanode.volume.min.free.space.hard.limit.percent"); private static final MetricsInfo NON_OZONE_USED = Interns.info("NonOzoneUsed", "Space on the filesystem consumed by non-Ozone workloads " + @@ -254,6 +258,7 @@ public void getMetrics(MetricsCollector collector, boolean all) { .addGauge(FS_AVAILABLE, fsUsage.getAvailable()) .addGauge(FS_USED, fsUsage.getCapacity() - fsUsage.getAvailable()) .addGauge(MIN_FREE_SPACE, volume.getReportedFreeSpaceToSpare(ozoneCapacity)) + .addGauge(HARD_MIN_FREE_SPACE, volume.getFreeSpaceToSpare(ozoneCapacity)) .addGauge(NON_OZONE_USED, VolumeUsage.getOtherUsed(fsUsage)); } } diff --git a/hadoop-hdds/container-service/src/main/resources/webapps/hddsDatanode/dn-overview.html b/hadoop-hdds/container-service/src/main/resources/webapps/hddsDatanode/dn-overview.html index 9b15a0bf374d..e25ce4a9c822 100644 --- a/hadoop-hdds/container-service/src/main/resources/webapps/hddsDatanode/dn-overview.html +++ b/hadoop-hdds/container-service/src/main/resources/webapps/hddsDatanode/dn-overview.html @@ -61,6 +61,7 @@

Volume Information

Filesystem Available Filesystem Used Min Free Space + Hard Min Free Space Non-Ozone Used Containers State @@ -79,6 +80,7 @@

Volume Information

{{volumeInfo.FilesystemAvailable}} {{volumeInfo.FilesystemUsed}} {{volumeInfo.MinFreeSpace}} + {{volumeInfo.HardMinFreeSpace}} {{volumeInfo.NonOzoneUsed}} {{volumeInfo.Containers}} {{volumeInfo["tag.VolumeState"]}} diff --git a/hadoop-hdds/container-service/src/main/resources/webapps/hddsDatanode/dn.js b/hadoop-hdds/container-service/src/main/resources/webapps/hddsDatanode/dn.js index 3e6c36662dd6..1f5ae99f15e0 100644 --- a/hadoop-hdds/container-service/src/main/resources/webapps/hddsDatanode/dn.js +++ b/hadoop-hdds/container-service/src/main/resources/webapps/hddsDatanode/dn.js @@ -38,6 +38,7 @@ volume.FilesystemAvailable = transform(volume.FilesystemAvailable); volume.FilesystemUsed = transform(volume.FilesystemUsed); volume.MinFreeSpace = transform(volume.MinFreeSpace); + volume.HardMinFreeSpace = transform(volume.HardMinFreeSpace); volume.NonOzoneUsed = transform(volume.NonOzoneUsed); }) }); diff --git a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/volume/TestVolumeInfoMetrics.java b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/volume/TestVolumeInfoMetrics.java index bca6170d6b61..c428be693db8 100644 --- a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/volume/TestVolumeInfoMetrics.java +++ b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/volume/TestVolumeInfoMetrics.java @@ -45,6 +45,7 @@ void testVolumeInfoMetricsExposeOzoneAndFilesystemGauges() { when(volume.getCommittedBytes()).thenReturn(10L); when(volume.getContainers()).thenReturn(3L); when(volume.getReportedFreeSpaceToSpare(anyLong())).thenReturn(20L); + when(volume.getFreeSpaceToSpare(anyLong())).thenReturn(15L); VolumeUsage volumeUsage = mock(VolumeUsage.class); when(volume.getVolumeUsage()).thenReturn(volumeUsage); @@ -80,6 +81,7 @@ void testVolumeInfoMetricsExposeOzoneAndFilesystemGauges() { assertThat(findMetric(all, "FilesystemUsed")).isEqualTo(900L); // FilesystemCapacity - FilesystemAvailable assertThat(findMetric(all, "MinFreeSpace")).isEqualTo(20L); + assertThat(findMetric(all, "HardMinFreeSpace")).isEqualTo(15L); // NonOzoneUsed = FilesystemUsed - OzoneUsed = 900 - 500 assertThat(findMetric(all, "NonOzoneUsed")).isEqualTo(400L); } finally { From 193137ccceb5e7f49ca0999e6002bf6d6bbdc542 Mon Sep 17 00:00:00 2001 From: Anurag Parvatikar Date: Wed, 24 Jun 2026 13:56:22 +0530 Subject: [PATCH 2/2] Addressed review comments --- .../ozone/container/common/volume/VolumeInfoMetrics.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/VolumeInfoMetrics.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/VolumeInfoMetrics.java index c078c5d3b918..27996eb44b7e 100644 --- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/VolumeInfoMetrics.java +++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/VolumeInfoMetrics.java @@ -64,7 +64,8 @@ public class VolumeInfoMetrics implements MetricsSource { private static final MetricsInfo HARD_MIN_FREE_SPACE = Interns.info("HardMinFreeSpace", "Minimum free space threshold (hard limit) enforced locally for writes, " + - "derived from hdds.datanode.volume.min.free.space.hard.limit.percent"); + "derived from hdds.datanode.volume.min.free.space.hard.limit.percent " + + "/ hdds.datanode.volume.min.free.space"); private static final MetricsInfo NON_OZONE_USED = Interns.info("NonOzoneUsed", "Space on the filesystem consumed by non-Ozone workloads " +