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 <[email protected]>
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 <[email protected]>
---
.../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: [email protected]
For additional commands, e-mail: [email protected]