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 2ebb1509771 HDDS-14831. Datanode should gracefully handle
CONTAINER_ALREADY_EXISTS (#9925)
2ebb1509771 is described below
commit 2ebb1509771e496acd9246d3c7e552d78f2aaa67
Author: Ming Wei <[email protected]>
AuthorDate: Mon Mar 23 01:12:23 2026 +0800
HDDS-14831. Datanode should gracefully handle CONTAINER_ALREADY_EXISTS
(#9925)
---
.../container/common/impl/HddsDispatcher.java | 1 +
.../container/common/impl/TestHddsDispatcher.java | 43 ++++++++++++++++++++++
2 files changed, 44 insertions(+)
diff --git
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/impl/HddsDispatcher.java
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/impl/HddsDispatcher.java
index b298c00bcd9..a109c02e5a1 100644
---
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/impl/HddsDispatcher.java
+++
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/impl/HddsDispatcher.java
@@ -175,6 +175,7 @@ private boolean canIgnoreException(Result result) {
case DELETE_ON_OPEN_CONTAINER:
case UNSUPPORTED_REQUEST:// Blame client for sending unsupported request.
case CONTAINER_MISSING:
+ case CONTAINER_ALREADY_EXISTS:
return true;
default:
return false;
diff --git
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/impl/TestHddsDispatcher.java
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/impl/TestHddsDispatcher.java
index aac75cac29c..da84d23d3e5 100644
---
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/impl/TestHddsDispatcher.java
+++
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/impl/TestHddsDispatcher.java
@@ -26,6 +26,7 @@
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.Mockito.any;
@@ -495,6 +496,48 @@ public void testWriteChunkWithCreateContainerFailure()
throws IOException {
}
}
+ @Test
+ public void testCreateContainerWhenAlreadyExistsDoesNotMarkUnhealthy()
throws IOException {
+ String testDirPath = testDir.getPath();
+ try {
+ UUID scmId = UUID.randomUUID();
+ OzoneConfiguration conf = new OzoneConfiguration();
+ conf.set(HDDS_DATANODE_DIR_KEY, testDirPath);
+ conf.set(OzoneConfigKeys.OZONE_METADATA_DIRS, testDirPath);
+ DatanodeDetails dd = randomDatanodeDetails();
+ HddsDispatcher hddsDispatcher = createDispatcher(dd, scmId, conf);
+
+ // Create container via WriteChunk
+ ContainerCommandRequestProto writeChunkRequest =
+ getWriteChunkRequest(dd.getUuidString(), 1L, 1L);
+ ContainerCommandResponseProto initialResponse =
+ hddsDispatcher.dispatch(writeChunkRequest, null);
+ assertEquals(ContainerProtos.Result.SUCCESS,
initialResponse.getResult());
+
+ // Send direct CreateContainer for existing container
+ ContainerCommandRequestProto createRequest =
+ ContainerCommandRequestProto.newBuilder()
+ .setCmdType(ContainerProtos.Type.CreateContainer)
+ .setContainerID(1L)
+
.setCreateContainer(ContainerProtos.CreateContainerRequestProto.newBuilder()
+
.setContainerType(ContainerProtos.ContainerType.KeyValueContainer)
+ .build())
+ .setDatanodeUuid(dd.getUuidString())
+ .build();
+
+ ContainerCommandResponseProto response =
+ hddsDispatcher.dispatch(createRequest, null);
+ assertEquals(ContainerProtos.Result.CONTAINER_ALREADY_EXISTS,
response.getResult());
+
+ Container container = hddsDispatcher.getContainer(1L);
+ assertNotNull(container);
+ assertTrue(container.getContainerData().isOpen());
+ assertFalse(container.getContainerData().isUnhealthy());
+ } finally {
+ ContainerMetrics.remove();
+ }
+ }
+
@Test
public void testDuplicateWriteChunkAndPutBlockRequest() throws IOException {
String testDirPath = testDir.getPath();
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]