فهرست منبع

HDDS-1374. ContainerStateMap cannot find container while allocating blocks. (#735)

Bharat Viswanadham 6 سال پیش
والد
کامیت
3ac3e50b20

+ 13 - 1
hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/SCMContainerManager.java

@@ -246,7 +246,17 @@ public class SCMContainerManager implements ContainerManager {
           containerStateManager.allocateContainer(pipelineManager, type,
               replicationFactor, owner);
       // Add container to DB.
-      addContainerToDB(containerInfo);
+      try {
+        addContainerToDB(containerInfo);
+      } catch (IOException ex) {
+        // When adding to DB failed, we are removing from containerStateMap.
+        // We should also remove from pipeline2Container Map in
+        // PipelineStateManager.
+        pipelineManager.removeContainerFromPipeline(
+            containerInfo.getPipelineID(),
+            new ContainerID(containerInfo.getContainerID()));
+        throw ex;
+      }
       return containerInfo;
     } finally {
       lock.unlock();
@@ -440,6 +450,8 @@ public class SCMContainerManager implements ContainerManager {
     } catch (IOException ex) {
       // If adding to containerStore fails, we should remove the container
       // from in-memory map.
+      LOG.error("Add Container to DB failed for ContainerID #{}",
+          containerInfo.getContainerID());
       try {
         containerStateManager.removeContainer(containerInfo.containerID());
       } catch (ContainerNotFoundException cnfe) {