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