You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ozone.apache.org by ad...@apache.org on 2026/10/18 10:57:18 UTC

(ozone) branch master updated: HDDS-17025. Fix handling of negative size during container import (#11565)

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

adoroszlai pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git


The following commit(s) were added to refs/heads/master by this push:
     new 378f9a617c2 HDDS-17025. Fix handling of negative size during container import (#11565)
378f9a617c2 is described below

commit 378f9a617c2fc6436e6a5684c375fc056d09e510
Author: Gargi Jaiswal <13...@users.noreply.github.com>
AuthorDate: Sun Oct 18 16:27:11 2026 +0530

    HDDS-17025. Fix handling of negative size during container import (#11565)
---
 .../container/replication/ContainerImporter.java   | 10 ++++----
 .../TestSendContainerRequestHandler.java           | 30 +++++++++++++++-------
 2 files changed, 26 insertions(+), 14 deletions(-)

diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/replication/ContainerImporter.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/replication/ContainerImporter.java
index 7b42006b229..369d62be568 100644
--- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/replication/ContainerImporter.java
+++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/replication/ContainerImporter.java
@@ -189,16 +189,16 @@ public long getRequiredReplicationSpace(long actualContainerSize) {
   }
 
   /**
-   * Get space to reserve for replication. If replicateSize is provided,
-   * calculate required space based on that, otherwise return default
-   * replication space.
+   * Get space to reserve for replication. If a non-negative replicateSize is
+   * provided and the space required for it does not overflow, calculate required
+   * space based on that, otherwise return default replication space.
    *
    * @param replicateSize the size of the container to replicate in bytes
-   *                      (can be null)
+   *                      (can be null, or negative if the source's counter has drifted)
    * @return space to reserve for replication
    */
   public long getSpaceToReserve(Long replicateSize) {
-    if (replicateSize != null) {
+    if (replicateSize != null && replicateSize >= 0 && getRequiredReplicationSpace(replicateSize) >= 0) {
       return getRequiredReplicationSpace(replicateSize);
     } else {
       return getDefaultReplicationSpace();
diff --git a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/replication/TestSendContainerRequestHandler.java b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/replication/TestSendContainerRequestHandler.java
index 6a7bfa1063e..2b2b0b86e36 100644
--- a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/replication/TestSendContainerRequestHandler.java
+++ b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/replication/TestSendContainerRequestHandler.java
@@ -57,6 +57,7 @@
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.Arguments;
 import org.junit.jupiter.params.provider.MethodSource;
+import org.junit.jupiter.params.provider.ValueSource;
 
 /**
  * Test for {@link SendContainerRequestHandler}.
@@ -157,9 +158,7 @@ public void testSpaceReservedAndReleasedWhenRequestCompleted(String testName, Lo
     long containerId = 1;
     HddsVolume volume = (HddsVolume) volumeSet.getVolumesList().get(0);
     long initialCommittedBytes = volume.getCommittedBytes();
-    long expectedReservedSpace = size != null ?
-        importer.getRequiredReplicationSpace(size) :
-        importer.getDefaultReplicationSpace();
+    long expectedReservedSpace = importer.getSpaceToReserve(size);
 
     // Create and execute the first request to reserve space
     sendContainerRequestHandler.onNext(
@@ -181,9 +180,7 @@ public void testSpaceReservedAndReleasedWhenOnNextFails(String testName, Long si
     long containerId = 1;
     HddsVolume volume = (HddsVolume) volumeSet.getVolumesList().get(0);
     long initialCommittedBytes = volume.getCommittedBytes();
-    long expectedReservedSpace = size != null ?
-        importer.getRequiredReplicationSpace(size) :
-        importer.getDefaultReplicationSpace();
+    long expectedReservedSpace = importer.getSpaceToReserve(size);
 
     ByteString data = ByteString.copyFromUtf8("test");
     // Execute first request to reserve space
@@ -209,9 +206,7 @@ public void testSpaceReservedAndReleasedWhenOnCompletedFails(String testName, Lo
     long containerId = 1;
     HddsVolume volume = (HddsVolume) volumeSet.getVolumesList().get(0);
     long initialCommittedBytes = volume.getCommittedBytes();
-    long expectedReservedSpace = size != null ?
-        importer.getRequiredReplicationSpace(size) :
-        importer.getDefaultReplicationSpace();
+    long expectedReservedSpace = importer.getSpaceToReserve(size);
 
     // Execute request
     sendContainerRequestHandler.onNext(createRequest(containerId,
@@ -261,6 +256,23 @@ public void testOverAllocatedReservesMoreSpace() {
     assertEquals(2 * containerMaxSize, defaultReservation);
   }
 
+  /**
+   * A negative size (for example a source whose bytes used counter has drifted below zero), or one whose
+   * required space overflows, must reserve the default space, and release it when the request completes.
+   */
+  @ParameterizedTest
+  @ValueSource(longs = {-1_234_567_890L, Long.MAX_VALUE})
+  public void testInvalidSizeReservesDefaultSpace(long size) {
+    HddsVolume volume = (HddsVolume) volumeSet.getVolumesList().get(0);
+    long initialCommittedBytes = volume.getCommittedBytes();
+
+    sendContainerRequestHandler.onNext(createRequest(1, ByteString.EMPTY, 0, size));
+    assertEquals(initialCommittedBytes + importer.getDefaultReplicationSpace(), volume.getCommittedBytes());
+
+    sendContainerRequestHandler.onCompleted();
+    assertEquals(initialCommittedBytes, volume.getCommittedBytes());
+  }
+
   private ContainerProtos.SendContainerRequest createRequest(
       long containerId, ByteString data, int offset, Long size) {
     ContainerProtos.SendContainerRequest.Builder builder =


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@ozone.apache.org
For additional commands, e-mail: commits-help@ozone.apache.org