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