This is an automated email from the ASF dual-hosted git repository.

sammichen pushed a commit to branch HDDS-5713
in repository https://gitbox.apache.org/repos/asf/ozone.git


The following commit(s) were added to refs/heads/HDDS-5713 by this push:
     new 1cc4a874805 HDDS-14186. [DiskBalancer] Don't pick size 0 container 
when choosing container to move (#9514)
1cc4a874805 is described below

commit 1cc4a8748050d542350f036aee681ddfa2154f31
Author: Gargi Jaiswal <[email protected]>
AuthorDate: Fri Dec 19 11:45:57 2025 +0530

    HDDS-14186. [DiskBalancer] Don't pick size 0 container when choosing 
container to move (#9514)
---
 .../policy/DefaultContainerChoosingPolicy.java     |  4 +-
 .../TestDefaultContainerChoosingPolicy.java        | 63 +++++++++++++++++++---
 .../scm/node/TestContainerChoosingPolicy.java      |  4 ++
 3 files changed, 61 insertions(+), 10 deletions(-)

diff --git 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/diskbalancer/policy/DefaultContainerChoosingPolicy.java
 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/diskbalancer/policy/DefaultContainerChoosingPolicy.java
index 11728beb943..1f55a976548 100644
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/diskbalancer/policy/DefaultContainerChoosingPolicy.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/diskbalancer/policy/DefaultContainerChoosingPolicy.java
@@ -78,8 +78,8 @@ public ContainerData chooseContainer(OzoneContainer 
ozoneContainer,
     final long dstCommittedBytes = dst.getCommittedBytes();
     while (itr.hasNext()) {
       ContainerData containerData = itr.next().getContainerData();
-      if (!inProgressContainerIDs.contains(
-          ContainerID.valueOf(containerData.getContainerID())) &&
+      if (containerData.getBytesUsed() > 0 &&
+          
!inProgressContainerIDs.contains(ContainerID.valueOf(containerData.getContainerID()))
 &&
           (containerData.isClosed() || (test && 
containerData.isQuasiClosed()))) {
 
         // Check if dst can accept the candidate container.
diff --git 
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/diskbalancer/TestDefaultContainerChoosingPolicy.java
 
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/diskbalancer/TestDefaultContainerChoosingPolicy.java
index 32586223159..726dad5555a 100644
--- 
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/diskbalancer/TestDefaultContainerChoosingPolicy.java
+++ 
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/diskbalancer/TestDefaultContainerChoosingPolicy.java
@@ -35,12 +35,14 @@
 import java.util.Set;
 import java.util.UUID;
 import org.apache.hadoop.hdds.conf.OzoneConfiguration;
+import org.apache.hadoop.hdds.conf.StorageUnit;
 import org.apache.hadoop.hdds.fs.MockSpaceUsageCheckFactory;
 import org.apache.hadoop.hdds.fs.MockSpaceUsageSource;
 import org.apache.hadoop.hdds.fs.SpaceUsageCheckFactory;
 import org.apache.hadoop.hdds.fs.SpaceUsagePersistence;
 import org.apache.hadoop.hdds.fs.SpaceUsageSource;
 import 
org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.ContainerDataProto;
+import org.apache.hadoop.hdds.scm.ScmConfigKeys;
 import org.apache.hadoop.hdds.scm.container.ContainerID;
 import org.apache.hadoop.ozone.container.common.impl.ContainerData;
 import org.apache.hadoop.ozone.container.common.impl.ContainerLayoutVersion;
@@ -154,14 +156,7 @@ private HddsVolume createVolume(String dir, double 
utilization)
    */
   private void createContainer(long id, long size, HddsVolume vol)
       throws IOException {
-    KeyValueContainerData containerData = new KeyValueContainerData(id,
-        ContainerLayoutVersion.FILE_PER_BLOCK, size,
-        UUID.randomUUID().toString(), UUID.randomUUID().toString());
-    containerData.setState(ContainerDataProto.State.CLOSED);
-    containerData.setVolume(vol);
-    containerData.getStatistics().setBlockBytesForTesting(size);
-    KeyValueContainer container = new KeyValueContainer(containerData, CONF);
-    containerSet.addContainer(container);
+    createContainer(id, size, vol, containerSet);
   }
 
   @Test
@@ -200,4 +195,56 @@ public void testContainerNotChosen() {
     // No containers should not be chosen
     assertNull(chosenContainer);
   }
+
+  @Test
+  public void testSizeZeroContainersSkipped() throws IOException {
+    // Create a new container set with containers that have size 0
+    ContainerSet testContainerSet = newContainerSet();
+    
+    // Create containers with size 0 (should be skipped)
+    createContainer(10L, 0L, sourceVolume, testContainerSet);
+    createContainer(11L, 0L, sourceVolume, testContainerSet);
+    
+    // Create a container with non-zero size (should be chosen)
+    createContainer(12L, 200L * MB, sourceVolume, testContainerSet);
+    
+    // Mock OzoneContainer to return our test container set
+    OzoneContainer testOzoneContainer = mock(OzoneContainer.class);
+    ContainerController testController = new 
ContainerController(testContainerSet, null);
+    when(testOzoneContainer.getController()).thenReturn(testController);
+    
+    // The policy should skip containers 10 and 11 (size 0) and choose 
container 12
+    ContainerData chosenContainer = policy.chooseContainer(testOzoneContainer,
+        sourceVolume, destVolume1, inProgressContainerIDs, THRESHOLD, 
volumeSet, deltaMap);
+    
+    // Container 12 (non-zero size) should be chosen, skipping containers 10 
and 11 (size 0)
+    assertNotNull(chosenContainer);
+    assertEquals(12L, chosenContainer.getContainerID());
+    assertEquals(200L * MB, chosenContainer.getBytesUsed());
+  }
+
+  /**
+   * Create KeyValueContainers and add it to the specified containerSet.
+   * @param id container ID
+   * @param usedBytes bytes used by the container (can be 0)
+   * @param vol volume where container is located
+   * @param targetContainerSet container set to add the container to
+   */
+  private void createContainer(long id, long usedBytes, HddsVolume vol,
+      ContainerSet targetContainerSet) throws IOException {
+    // Use maxSize as the container capacity (must be > 0)
+    // If usedBytes is 0, we still need a valid maxSize for container creation
+    long maxSize = usedBytes > 0 ? usedBytes : (long) CONF.getStorageSize(
+        ScmConfigKeys.OZONE_SCM_CONTAINER_SIZE,
+        ScmConfigKeys.OZONE_SCM_CONTAINER_SIZE_DEFAULT, StorageUnit.BYTES);
+    KeyValueContainerData containerData = new KeyValueContainerData(id,
+        ContainerLayoutVersion.FILE_PER_BLOCK, maxSize,
+        UUID.randomUUID().toString(), UUID.randomUUID().toString());
+    containerData.setState(ContainerDataProto.State.CLOSED);
+    containerData.setVolume(vol);
+    // Set the actual used bytes (can be 0)
+    containerData.getStatistics().setBlockBytesForTesting(usedBytes);
+    KeyValueContainer container = new KeyValueContainer(containerData, CONF);
+    targetContainerSet.addContainer(container);
+  }
 }
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/scm/node/TestContainerChoosingPolicy.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/scm/node/TestContainerChoosingPolicy.java
index 15c39626564..b9d5989fcab 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/scm/node/TestContainerChoosingPolicy.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/scm/node/TestContainerChoosingPolicy.java
@@ -273,6 +273,10 @@ public void createContainers() {
 
       containerData.setState(isOpen ? ContainerDataProto.State.OPEN : 
ContainerDataProto.State.CLOSED);
       containerData.setVolume(volume);
+      // Set some bytes used for containers so they can be chosen for disk 
balancing
+      // Use a small non-zero value to ensure containers are not skipped
+      long bytesUsed = isOpen ? 0 : (i % 1000 + 1) * 1024L; // 1KB to 1MB for 
closed containers
+      containerData.getStatistics().setBlockBytesForTesting(bytesUsed);
       KeyValueContainer container = new KeyValueContainer(containerData, CONF);
 
       try {


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to