You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ozone.apache.org by sa...@apache.org on 2026/10/22 11:18:48 UTC
(ozone) branch master updated: HDDS-17026. DN reserves space until restart for containers failed to create due to unchecked exception (#11659)
This is an automated email from the ASF dual-hosted git repository.
sarvekshayr 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 319499f6bb6 HDDS-17026. DN reserves space until restart for containers failed to create due to unchecked exception (#11659)
319499f6bb6 is described below
commit 319499f6bb60c739c8b40caf26963b2ddd539a1f
Author: Gargi Jaiswal <13...@users.noreply.github.com>
AuthorDate: Thu Oct 22 16:48:43 2026 +0530
HDDS-17026. DN reserves space until restart for containers failed to create due to unchecked exception (#11659)
---
.../ozone/container/keyvalue/KeyValueHandler.java | 5 ++-
.../container/keyvalue/TestKeyValueHandler.java | 43 ++++++++++++++++++++++
2 files changed, 47 insertions(+), 1 deletion(-)
diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/KeyValueHandler.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/KeyValueHandler.java
index 411866044a3..23e256fa439 100644
--- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/KeyValueHandler.java
+++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/KeyValueHandler.java
@@ -511,10 +511,13 @@ ContainerCommandResponseProto handleCreateContainer(
LOG.debug("Container already exists. container Id {}", containerID);
}
} catch (StorageContainerException ex) {
- newContainerData.releaseCommitSpace();
return ContainerUtils.logAndReturnError(LOG, ex, request);
} finally {
containerIdLock.unlock();
+ if (!created) {
+ // Release the space reserved when the volume was chosen, also on unchecked exceptions.
+ newContainerData.releaseCommitSpace();
+ }
}
if (created) {
diff --git a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/TestKeyValueHandler.java b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/TestKeyValueHandler.java
index c8fb512386d..c05e9de787b 100644
--- a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/TestKeyValueHandler.java
+++ b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/TestKeyValueHandler.java
@@ -22,6 +22,7 @@
import static org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.ContainerDataProto.State.CLOSED;
import static org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.ContainerDataProto.State.QUASI_CLOSED;
import static org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.ContainerDataProto.State.UNHEALTHY;
+import static org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.Result.CONTAINER_INTERNAL_ERROR;
import static org.apache.hadoop.hdds.scm.ScmConfigKeys.HDDS_DATANODE_DIR_KEY;
import static org.apache.hadoop.hdds.scm.ScmConfigKeys.OZONE_SCM_CONTAINER_LAYOUT_KEY;
import static org.apache.hadoop.ozone.OzoneConsts.GB;
@@ -978,6 +979,48 @@ public void testICRsOnContainerClose(ContainerLayoutVersion containerLayoutVersi
}
}
+ @Test
+ public void testCreateContainerReleasesSpaceOnUncheckedFailure() throws Exception {
+ final long containerID = 1L;
+ HandlerWithVolumeSet handlerWithVolume = createKeyValueHandlerWithVolumeSet(tempDir);
+ HddsVolume hddsVolume = (HddsVolume) handlerWithVolume.getVolumeSet().getVolumesList().get(0);
+ hddsVolume.setDbParentDir(null);
+ String datanodeId = handlerWithVolume.getHandler().getDatanodeId();
+
+ ContainerCommandResponseProto response = handlerWithVolume.getHandler().handle(
+ createContainerRequest(datanodeId, containerID), null, null);
+
+ assertEquals(CONTAINER_INTERNAL_ERROR, response.getResult());
+ assertThat(response.getMessage()).contains("dbParentDir == null");
+ assertEquals(0, hddsVolume.getCommittedBytes());
+ assertNull(handlerWithVolume.getContainerSet().getContainer(containerID));
+ }
+
+ @Test
+ public void testCreateContainerKeepsSpaceOfCreatedContainer() throws Exception {
+ final long containerID = 1L;
+ HandlerWithVolumeSet handlerWithVolume = createKeyValueHandlerWithVolumeSet(tempDir);
+ HddsVolume hddsVolume = (HddsVolume) handlerWithVolume.getVolumeSet().getVolumesList().get(0);
+ String datanodeId = handlerWithVolume.getHandler().getDatanodeId();
+ KeyValueHandler kvHandler = handlerWithVolume.getHandler();
+
+ ContainerCommandResponseProto response =
+ kvHandler.handleCreateContainer(createContainerRequest(datanodeId, containerID), null);
+ assertEquals(ContainerProtos.Result.SUCCESS, response.getResult());
+ KeyValueContainer container =
+ (KeyValueContainer) handlerWithVolume.getContainerSet().getContainer(containerID);
+ assertNotNull(container);
+ assertEquals(maxContainerSize, hddsVolume.getCommittedBytes());
+ assertTrue(container.getContainerData().isCommittedSpace());
+
+ long committedAfterFirst = hddsVolume.getCommittedBytes();
+ ContainerCommandResponseProto response2 =
+ kvHandler.handleCreateContainer(createContainerRequest(datanodeId, containerID), null);
+ assertEquals(ContainerProtos.Result.SUCCESS, response2.getResult());
+ assertEquals(committedAfterFirst, hddsVolume.getCommittedBytes());
+ assertTrue(container.getContainerData().isCommittedSpace());
+ }
+
private static ContainerCommandRequestProto createContainerRequest(
String datanodeId, long containerID) {
return ContainerCommandRequestProto.newBuilder()
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@ozone.apache.org
For additional commands, e-mail: commits-help@ozone.apache.org