You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by na...@apache.org on 2019/02/21 16:08:13 UTC

[hadoop] branch trunk updated: HDDS-1126. Datanode is trying to qausi-close a container which is already closed.

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

nanda pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/hadoop.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 2bc3cfe  HDDS-1126. Datanode is trying to qausi-close a container which is already closed.
2bc3cfe is described below

commit 2bc3cfe28fe66e192ad37a84aa00d3d44b94491a
Author: Nanda kumar <na...@apache.org>
AuthorDate: Thu Feb 21 21:37:08 2019 +0530

    HDDS-1126. Datanode is trying to qausi-close a container which is already closed.
    
    Signed-off-by: Nanda kumar <na...@apache.org>
---
 .../CloseContainerCommandHandler.java              |  5 +++
 .../TestCloseContainerCommandHandler.java          | 41 ++++++++++++++++++++++
 2 files changed, 46 insertions(+)

diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/statemachine/commandhandler/CloseContainerCommandHandler.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/statemachine/commandhandler/CloseContainerCommandHandler.java
index 60a0255..7ca892d 100644
--- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/statemachine/commandhandler/CloseContainerCommandHandler.java
+++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/statemachine/commandhandler/CloseContainerCommandHandler.java
@@ -86,6 +86,11 @@ public class CloseContainerCommandHandler implements CommandHandler {
         return;
       }
 
+      if (container.getContainerState() == ContainerProtos.ContainerDataProto.State.CLOSED) {
+        // Closing a container is an idempotent operation.
+        return;
+      }
+
       // Move the container to CLOSING state
       controller.markContainerForClose(containerId);
 
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 e9683f7..7079770 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
@@ -215,6 +215,47 @@ public class TestCloseContainerCommandHandler {
     }
   }
 
+  @Test
+  public void testQuasiCloseClosedContainer()
+      throws Exception {
+    final OzoneConfiguration conf = new OzoneConfiguration();
+    final DatanodeDetails datanodeDetails = randomDatanodeDetails();
+    final OzoneContainer ozoneContainer = getOzoneContainer(conf, datanodeDetails);
+    ozoneContainer.start();
+    try {
+      final Container container = createContainer(conf, datanodeDetails, ozoneContainer);
+      Mockito.verify(context.getParent(),
+          Mockito.times(1)).triggerHeartbeat();
+      final long containerId = container.getContainerData().getContainerID();
+      final PipelineID pipelineId = PipelineID.valueOf(UUID.fromString(
+          container.getContainerData().getOriginPipelineId()));
+
+      final CloseContainerCommandHandler closeHandler = new CloseContainerCommandHandler();
+      final CloseContainerCommand closeCommand = new CloseContainerCommand(
+          containerId, pipelineId);
+
+      closeHandler.handle(closeCommand, ozoneContainer, context, null);
+
+      Assert.assertEquals(ContainerProtos.ContainerDataProto.State.CLOSED,
+          ozoneContainer.getContainerSet().getContainer(containerId)
+              .getContainerState());
+
+      // The container is closed, now we send close command with pipeline id which doesn't exist.
+      // This should cause the datanode to trigger quasi close, since the container is already
+      // closed, this should do nothing. The command should not fail either.
+      final PipelineID randomPipeline = PipelineID.randomId();
+      final CloseContainerCommand quasiCloseCommand = new CloseContainerCommand(
+          containerId, randomPipeline);
+      closeHandler.handle(quasiCloseCommand, ozoneContainer, context, null);
+
+      Assert.assertEquals(ContainerProtos.ContainerDataProto.State.CLOSED,
+          ozoneContainer.getContainerSet().getContainer(containerId)
+              .getContainerState());
+    } finally {
+      ozoneContainer.stop();
+    }
+  }
+
   private OzoneContainer getOzoneContainer(final OzoneConfiguration conf,
       final DatanodeDetails datanodeDetails) throws IOException {
     testDir = GenericTestUtils.getTestDir(


---------------------------------------------------------------------
To unsubscribe, e-mail: common-commits-unsubscribe@hadoop.apache.org
For additional commands, e-mail: common-commits-help@hadoop.apache.org