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]