This is an automated email from the ASF dual-hosted git repository.

avijayan 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 e12a6b9  HDDS-5611. Fixed NullPointerException in 
ContainerStateMachine during Pipeline Close. (#2548)
e12a6b9 is described below

commit e12a6b9c8d4833ccbfbae31ee7e6637eb6d6b8a4
Author: Aswin Shakil Balasubramanian <[email protected]>
AuthorDate: Thu Aug 26 14:16:26 2021 -0400

    HDDS-5611. Fixed NullPointerException in ContainerStateMachine during 
Pipeline Close. (#2548)
---
 .../container/ozoneimpl/ContainerController.java   | 24 ++++++++++++++--
 .../TestCloseContainerCommandHandler.java          | 33 ++++++++++++++++++++--
 2 files changed, 51 insertions(+), 6 deletions(-)

diff --git 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/ozoneimpl/ContainerController.java
 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/ozoneimpl/ContainerController.java
index 2398c85..9beec5b 100644
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/ozoneimpl/ContainerController.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/ozoneimpl/ContainerController.java
@@ -23,12 +23,15 @@ import 
org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos
     .ContainerDataProto.State;
 import org.apache.hadoop.hdds.protocol.proto
     .StorageContainerDatanodeProtocolProtos.ContainerReportsProto;
+import org.apache.hadoop.hdds.scm.container.ContainerNotFoundException;
 import org.apache.hadoop.ozone.container.common.impl.ContainerData;
 import org.apache.hadoop.ozone.container.common.impl.ContainerSet;
 import org.apache.hadoop.ozone.container.common.interfaces.Container;
 import org.apache.hadoop.ozone.container.common.interfaces.Handler;
 import org.apache.hadoop.ozone.container.common.volume.HddsVolume;
 import org.apache.hadoop.ozone.container.keyvalue.TarContainerPacker;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -36,6 +39,7 @@ import java.io.OutputStream;
 import java.time.Instant;
 import java.util.Iterator;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * Control plane for container management in datanode.
@@ -44,6 +48,8 @@ public class ContainerController {
 
   private final ContainerSet containerSet;
   private final Map<ContainerType, Handler> handlers;
+  private static final Logger LOG =
+      LoggerFactory.getLogger(ContainerController.class);
 
   public ContainerController(final ContainerSet containerSet,
       final Map<ContainerType, Handler> handlers) {
@@ -79,9 +85,21 @@ public class ContainerController {
   public void markContainerForClose(final long containerId)
       throws IOException {
     Container container = containerSet.getContainer(containerId);
-
-    if (container.getContainerState() == State.OPEN) {
-      getHandler(container).markContainerForClose(container);
+    if (container == null) {
+      String warning;
+      Set<Long> missingContainerSet = containerSet.getMissingContainerSet();
+      if (missingContainerSet.contains(containerId)) {
+        warning = "The Container is in the MissingContainerSet " +
+                "hence we can't close it. ContainerID: " + containerId;
+      } else {
+        warning = "The Container is not found. ContainerID: " + containerId;
+      }
+      LOG.warn(warning);
+      throw new ContainerNotFoundException(warning);
+    } else {
+      if (container.getContainerState() == State.OPEN) {
+        getHandler(container).markContainerForClose(container);
+      }
     }
   }
 
diff --git 
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/statemachine/commandhandler/TestCloseContainerCommandHandler.java
 
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/statemachine/commandhandler/TestCloseContainerCommandHandler.java
index ae9e428..a1ae60b 100644
--- 
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/statemachine/commandhandler/TestCloseContainerCommandHandler.java
+++ 
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/statemachine/commandhandler/TestCloseContainerCommandHandler.java
@@ -34,6 +34,7 @@ import 
org.apache.hadoop.ozone.container.keyvalue.KeyValueContainerData;
 import org.apache.hadoop.ozone.container.ozoneimpl.ContainerController;
 import org.apache.hadoop.ozone.container.ozoneimpl.OzoneContainer;
 import org.apache.hadoop.ozone.protocol.commands.CloseContainerCommand;
+import org.apache.ozone.test.GenericTestUtils;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -66,7 +67,8 @@ public class TestCloseContainerCommandHandler {
   private Handler containerHandler;
   private PipelineID pipelineID;
   private PipelineID nonExistentPipelineID = PipelineID.randomId();
-
+  private ContainerController controller;
+  private ContainerSet containerSet;
   private CloseContainerCommandHandler subject =
       new CloseContainerCommandHandler();
 
@@ -96,11 +98,11 @@ public class TestCloseContainerCommandHandler {
         pipelineID.getId().toString(), null);
 
     container = new KeyValueContainer(data, new OzoneConfiguration());
-    ContainerSet containerSet = new ContainerSet();
+    containerSet = new ContainerSet();
     containerSet.addContainer(container);
 
     containerHandler = mock(Handler.class);
-    ContainerController controller = new ContainerController(containerSet,
+    controller = new ContainerController(containerSet,
         singletonMap(ContainerProtos.ContainerType.KeyValueContainer,
             containerHandler));
 
@@ -204,6 +206,31 @@ public class TestCloseContainerCommandHandler {
         .submitRequest(any(), any());
   }
 
+  @Test
+  public void closeNonExistenceContainer() {
+    long containerID = 1L;
+    try {
+      controller.markContainerForClose(containerID);
+    } catch (IOException e) {
+
+      GenericTestUtils.assertExceptionContains("The Container " +
+                      "is not found. ContainerID: "+containerID, e);
+    }
+  }
+
+  @Test
+  public void closeMissingContainer() {
+    long containerID = 2L;
+    containerSet.getMissingContainerSet().add(containerID);
+    try {
+      controller.markContainerForClose(containerID);
+    } catch (IOException e) {
+      GenericTestUtils.assertExceptionContains("The Container is in " +
+              "the MissingContainerSet hence we can't close it. " +
+              "ContainerID: "+containerID, e);
+    }
+  }
+
   private CloseContainerCommand closeWithKnownPipeline() {
     return new CloseContainerCommand(CONTAINER_ID, pipelineID);
   }

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to