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]

Reply via email to