hadoop-common-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From aengin...@apache.org
Subject hadoop git commit: HDFS-11581. Ozone: Support force delete a container. Contributed by Yuanbo Liu.
Date Tue, 18 Apr 2017 01:21:28 GMT
Repository: hadoop
Updated Branches:
  refs/heads/HDFS-7240 350220bfb -> 368424b46


HDFS-11581. Ozone: Support force delete a container. Contributed by Yuanbo Liu.


Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo
Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/368424b4
Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/368424b4
Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/368424b4

Branch: refs/heads/HDFS-7240
Commit: 368424b46534de937a10c72fec424ea506a00700
Parents: 350220b
Author: Anu Engineer <aengineer@apache.org>
Authored: Mon Apr 17 17:58:54 2017 -0700
Committer: Anu Engineer <aengineer@apache.org>
Committed: Mon Apr 17 17:58:54 2017 -0700

----------------------------------------------------------------------
 .../main/proto/DatanodeContainerProtocol.proto  |   2 +
 .../common/helpers/ContainerUtils.java          |   8 +-
 .../common/impl/ContainerManagerImpl.java       |   7 +-
 .../ozone/container/common/impl/Dispatcher.java |  14 +-
 .../common/interfaces/ContainerManager.java     |   5 +-
 .../ozone/container/ContainerTestHelper.java    |  15 ++
 .../common/impl/TestContainerPersistence.java   |   4 +-
 .../container/ozoneimpl/TestOzoneContainer.java | 267 +++++++++++--------
 8 files changed, 208 insertions(+), 114 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hadoop/blob/368424b4/hadoop-hdfs-project/hadoop-hdfs-client/src/main/proto/DatanodeContainerProtocol.proto
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/proto/DatanodeContainerProtocol.proto
b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/proto/DatanodeContainerProtocol.proto
index 09b7602..2d018ee 100644
--- a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/proto/DatanodeContainerProtocol.proto
+++ b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/proto/DatanodeContainerProtocol.proto
@@ -126,6 +126,7 @@ enum Result {
   CLOSED_CONTAINER_IO = 22;
   ERROR_CONTAINER_NOT_EMPTY = 23;
   ERROR_IN_COMPACT_DB = 24;
+  UNCLOSED_CONTAINER_IO = 25;
 }
 
 message ContainerCommandRequestProto {
@@ -244,6 +245,7 @@ message  UpdateContainerResponseProto {
 message  DeleteContainerRequestProto {
   required Pipeline pipeline = 1;
   required string name = 2;
+  optional bool forceDelete = 3 [default = false];
 }
 
 message  DeleteContainerResponseProto {

http://git-wip-us.apache.org/repos/asf/hadoop/blob/368424b4/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/helpers/ContainerUtils.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/helpers/ContainerUtils.java
b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/helpers/ContainerUtils.java
index fa5de14..7d0e756 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/helpers/ContainerUtils.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/helpers/ContainerUtils.java
@@ -338,15 +338,19 @@ public final class ContainerUtils {
    * we created on the data location.
    *
    * @param containerData - Data of the container to remove.
+   * @param conf - configuration of the cluster.
+   * @param forceDelete - whether this container should be deleted forcibly.
    * @throws IOException
    */
   public static void removeContainer(ContainerData containerData,
-      Configuration conf) throws IOException {
+      Configuration conf, boolean forceDelete) throws IOException {
     Preconditions.checkNotNull(containerData);
     Path dbPath = Paths.get(containerData.getDBPath());
 
     LevelDBStore db = KeyUtils.getDB(containerData, conf);
-    if(!db.isEmpty()) {
+    // If the container is not empty and cannot be deleted forcibly,
+    // then throw a SCE to stop deleting.
+    if(!forceDelete && !db.isEmpty()) {
       throw new StorageContainerException(
           "Container cannot be deleted because it is not empty.",
           ContainerProtos.Result.ERROR_CONTAINER_NOT_EMPTY);

http://git-wip-us.apache.org/repos/asf/hadoop/blob/368424b4/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/impl/ContainerManagerImpl.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/impl/ContainerManagerImpl.java
b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/impl/ContainerManagerImpl.java
index 545f11d..5beae37 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/impl/ContainerManagerImpl.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/impl/ContainerManagerImpl.java
@@ -372,11 +372,12 @@ public class ContainerManagerImpl implements ContainerManager {
    *
    * @param pipeline - nodes that make this container.
    * @param containerName - name of the container.
+   * @param forceDelete - whether this container should be deleted forcibly.
    * @throws StorageContainerException
    */
   @Override
-  public void deleteContainer(Pipeline pipeline, String containerName) throws
-      StorageContainerException {
+  public void deleteContainer(Pipeline pipeline, String containerName,
+      boolean forceDelete) throws StorageContainerException {
     Preconditions.checkNotNull(containerName, "Container name cannot be null");
     Preconditions.checkState(containerName.length() > 0,
         "Container name length cannot be zero.");
@@ -388,7 +389,7 @@ public class ContainerManagerImpl implements ContainerManager {
         throw new StorageContainerException("No such container. Name : " +
             containerName, CONTAINER_NOT_FOUND);
       }
-      ContainerUtils.removeContainer(status.containerData, conf);
+      ContainerUtils.removeContainer(status.containerData, conf, forceDelete);
       containerMap.remove(containerName);
     } catch (StorageContainerException e) {
       throw e;

http://git-wip-us.apache.org/repos/asf/hadoop/blob/368424b4/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/impl/Dispatcher.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/impl/Dispatcher.java
b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/impl/Dispatcher.java
index fc72e73..d4173e8 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/impl/Dispatcher.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/impl/Dispatcher.java
@@ -51,6 +51,7 @@ import static org.apache.hadoop.hdfs.ozone.protocol.proto.ContainerProtos.Result
 import static org.apache.hadoop.hdfs.ozone.protocol.proto.ContainerProtos.Result.GET_SMALL_FILE_ERROR;
 import static org.apache.hadoop.hdfs.ozone.protocol.proto.ContainerProtos.Result.NO_SUCH_ALGORITHM;
 import static org.apache.hadoop.hdfs.ozone.protocol.proto.ContainerProtos.Result.PUT_SMALL_FILE_ERROR;
+import static org.apache.hadoop.hdfs.ozone.protocol.proto.ContainerProtos.Result.UNCLOSED_CONTAINER_IO;
 
 /**
  * Ozone Container dispatcher takes a call from the netty server and routes it
@@ -362,11 +363,22 @@ public class Dispatcher implements ContainerDispatcher {
     }
 
     String name = msg.getDeleteContainer().getName();
+    boolean forceDelete = msg.getDeleteContainer().getForceDelete();
     Pipeline pipeline = Pipeline.getFromProtoBuf(
         msg.getDeleteContainer().getPipeline());
     Preconditions.checkNotNull(pipeline);
 
-    this.containerManager.deleteContainer(pipeline, name);
+    // If this cmd requires force deleting, then we should
+    // make sure the container is in the state of closed,
+    // otherwise, stop deleting container.
+    if (forceDelete) {
+      if (this.containerManager.isOpen(pipeline.getContainerName())) {
+        throw new StorageContainerException("Attempting to force delete "
+            + "an open container.", UNCLOSED_CONTAINER_IO);
+      }
+    }
+
+    this.containerManager.deleteContainer(pipeline, name, forceDelete);
     return ContainerUtils.getContainerResponse(msg);
   }
 

http://git-wip-us.apache.org/repos/asf/hadoop/blob/368424b4/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/interfaces/ContainerManager.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/interfaces/ContainerManager.java
b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/interfaces/ContainerManager.java
index 378adcf..4f587a4 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/interfaces/ContainerManager.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/interfaces/ContainerManager.java
@@ -64,10 +64,11 @@ public interface ContainerManager extends RwLock {
    *
    * @param pipeline      - nodes that make this container.
    * @param containerName - name of the container.
+   * @param forceDelete   - whether this container should be deleted forcibly.
    * @throws StorageContainerException
    */
-  void deleteContainer(Pipeline pipeline, String containerName)
-      throws StorageContainerException;
+  void deleteContainer(Pipeline pipeline, String containerName,
+      boolean forceDelete) throws StorageContainerException;
 
   /**
    * Update an existing container.

http://git-wip-us.apache.org/repos/asf/hadoop/blob/368424b4/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/ozone/container/ContainerTestHelper.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/ozone/container/ContainerTestHelper.java
b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/ozone/container/ContainerTestHelper.java
index 7e8623a..89b358a 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/ozone/container/ContainerTestHelper.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/ozone/container/ContainerTestHelper.java
@@ -508,4 +508,19 @@ public final class ContainerTestHelper {
     return cmd;
   }
 
+  /**
+   * Returns a delete container request.
+   * @param pipeline - pipeline
+   * @return ContainerCommandRequestProto.
+   */
+  public static ContainerCommandRequestProto getDeleteContainer(
+      Pipeline pipeline, boolean forceDelete) {
+    Preconditions.checkNotNull(pipeline);
+    ContainerProtos.DeleteContainerRequestProto deleteRequest =
+        ContainerProtos.DeleteContainerRequestProto.newBuilder().setName(
+            pipeline.getContainerName()).setPipeline(
+            pipeline.getProtobufMessage()).setForceDelete(forceDelete).build();
+    return ContainerCommandRequestProto.newBuilder().setCmdType(ContainerProtos
+        .Type.DeleteContainer).setDeleteContainer(deleteRequest).build();
+  }
 }

http://git-wip-us.apache.org/repos/asf/hadoop/blob/368424b4/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/ozone/container/common/impl/TestContainerPersistence.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/ozone/container/common/impl/TestContainerPersistence.java
b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/ozone/container/common/impl/TestContainerPersistence.java
index 4ff0da3..110093a 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/ozone/container/common/impl/TestContainerPersistence.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/ozone/container/common/impl/TestContainerPersistence.java
@@ -219,7 +219,7 @@ public class TestContainerPersistence {
         .containsKey(containerName2));
 
     containerManager.deleteContainer(createSingleNodePipeline(containerName1),
-        containerName1);
+        containerName1, false);
     Assert.assertFalse(containerManager.getContainerMap()
         .containsKey(containerName1));
 
@@ -251,7 +251,7 @@ public class TestContainerPersistence {
         "Container cannot be deleted because it is not empty.");
     containerManager.deleteContainer(
         createSingleNodePipeline(containerName1),
-        containerName1);
+        containerName1, false);
     Assert.assertTrue(containerManager.getContainerMap()
         .containsKey(containerName1));
   }

http://git-wip-us.apache.org/repos/asf/hadoop/blob/368424b4/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestOzoneContainer.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestOzoneContainer.java
b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestOzoneContainer.java
index c0e33a7..79ad784 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestOzoneContainer.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestOzoneContainer.java
@@ -124,7 +124,7 @@ public class TestOzoneContainer {
         pipeline, conf);
 
     try {
-      runTestOzoneContainerViaDataNode(containerName, pipeline, client);
+      runTestOzoneContainerViaDataNode(containerName, client);
     } finally {
       cluster.shutdown();
     }
@@ -170,7 +170,7 @@ public class TestOzoneContainer {
       // This client talks to ozone container via datanode.
       XceiverClient client = new XceiverClient(pipeline, conf);
 
-      runTestOzoneContainerViaDataNode(containerName, pipeline, client);
+      runTestOzoneContainerViaDataNode(containerName, client);
     } finally {
       if (cluster != null) {
         cluster.shutdown();
@@ -178,30 +178,19 @@ public class TestOzoneContainer {
     }
   }
 
-  static void runTestOzoneContainerViaDataNode(
-      String containerName, Pipeline pipeline, XceiverClientSpi client)
-      throws Exception {
+  static void runTestOzoneContainerViaDataNode(String containerName,
+      XceiverClientSpi client) throws Exception {
+    ContainerProtos.ContainerCommandRequestProto
+        request, writeChunkRequest, putKeyRequest,
+        updateRequest1, updateRequest2;
+    ContainerProtos.ContainerCommandResponseProto response,
+        updateResponse1, updateResponse2;
     try {
       client.connect();
 
       // Create container
-      ContainerProtos.ContainerCommandRequestProto request =
-          ContainerTestHelper.getCreateContainerRequest(containerName);
-      ContainerProtos.ContainerCommandResponseProto response =
-          client.sendCommand(request);
-      Assert.assertNotNull(response);
-      Assert.assertTrue(request.getTraceID().equals(response.getTraceID()));
-
-      // Write Chunk
-      final String keyName = OzoneUtils.getRequestID();
-      ContainerProtos.ContainerCommandRequestProto writeChunkRequest =
-          ContainerTestHelper.getWriteChunkRequest(pipeline, containerName,
-              keyName, 1024);
-
-      response = client.sendCommand(writeChunkRequest);
-      Assert.assertNotNull(response);
-      Assert.assertEquals(ContainerProtos.Result.SUCCESS, response.getResult());
-      Assert.assertTrue(request.getTraceID().equals(response.getTraceID()));
+      createContainerForTesting(client, containerName);
+      writeChunkRequest = writeChunkForContainer(client, containerName, 1024);
 
       // Read Chunk
       request = ContainerTestHelper.getReadChunkRequest(writeChunkRequest
@@ -213,8 +202,7 @@ public class TestOzoneContainer {
       Assert.assertTrue(request.getTraceID().equals(response.getTraceID()));
 
       // Put Key
-      ContainerProtos.ContainerCommandRequestProto putKeyRequest =
-          ContainerTestHelper.getPutKeyRequest(writeChunkRequest
+      putKeyRequest = ContainerTestHelper.getPutKeyRequest(writeChunkRequest
               .getWriteChunk());
 
 
@@ -249,21 +237,17 @@ public class TestOzoneContainer {
       //Update an existing container
       Map<String, String> containerUpdate = new HashMap<String, String>();
       containerUpdate.put("container_updated_key", "container_updated_value");
-      ContainerProtos.ContainerCommandRequestProto updateRequest1 =
-          ContainerTestHelper.getUpdateContainerRequest(
+      updateRequest1 = ContainerTestHelper.getUpdateContainerRequest(
               containerName, containerUpdate);
-      ContainerProtos.ContainerCommandResponseProto updateResponse1 =
-          client.sendCommand(updateRequest1);
+      updateResponse1 = client.sendCommand(updateRequest1);
       Assert.assertNotNull(updateResponse1);
       Assert.assertEquals(ContainerProtos.Result.SUCCESS,
           response.getResult());
 
       //Update an non-existing container
-      ContainerProtos.ContainerCommandRequestProto updateRequest2 =
-          ContainerTestHelper.getUpdateContainerRequest(
+      updateRequest2 = ContainerTestHelper.getUpdateContainerRequest(
               "non_exist_container", containerUpdate);
-      ContainerProtos.ContainerCommandResponseProto updateResponse2 =
-          client.sendCommand(updateRequest2);
+      updateResponse2 = client.sendCommand(updateRequest2);
       Assert.assertEquals(ContainerProtos.Result.CONTAINER_NOT_FOUND,
           updateResponse2.getResult());
     } finally {
@@ -277,52 +261,31 @@ public class TestOzoneContainer {
   public void testBothGetandPutSmallFile() throws Exception {
     MiniOzoneCluster cluster = null;
     XceiverClient client = null;
+    ContainerProtos.ContainerCommandResponseProto response;
+    ContainerProtos.ContainerCommandRequestProto
+        smallFileRequest, getSmallFileRequest;
     try {
       String keyName = OzoneUtils.getRequestID();
-      String containerName = OzoneUtils.getRequestID();
       OzoneConfiguration conf = new OzoneConfiguration();
-      URL p = conf.getClass().getResource("");
-      String path = p.getPath().concat(
-          TestOzoneContainer.class.getSimpleName());
-      path += conf.getTrimmed(OzoneConfigKeys.OZONE_LOCALSTORAGE_ROOT,
-          OzoneConfigKeys.OZONE_LOCALSTORAGE_ROOT_DEFAULT);
-      conf.set(OzoneConfigKeys.OZONE_LOCALSTORAGE_ROOT, path);
-
-      // Start ozone container Via Datanode create.
-
-      Pipeline pipeline =
-          ContainerTestHelper.createSingleNodePipeline(containerName);
-      conf.setInt(OzoneConfigKeys.DFS_CONTAINER_IPC_PORT,
-          pipeline.getLeader().getContainerPort());
 
+      client = createClientForTesting(conf);
       cluster = new MiniOzoneCluster.Builder(conf)
           .setRandomContainerPort(false)
           .setHandlerType("distributed").build();
-
-      // This client talks to ozone container via datanode.
-      client = new XceiverClient(pipeline, conf);
       client.connect();
 
-      // Create container
-      ContainerProtos.ContainerCommandRequestProto request =
-          ContainerTestHelper.getCreateContainerRequest(containerName);
-      ContainerProtos.ContainerCommandResponseProto response =
-          client.sendCommand(request);
-      Assert.assertNotNull(response);
-      Assert.assertTrue(request.getTraceID().equals(response.getTraceID()));
-
-
-      ContainerProtos.ContainerCommandRequestProto smallFileRequest =
-          ContainerTestHelper.getWriteSmallFileRequest(pipeline, containerName,
-              keyName, 1024);
+      String containerName = client.getPipeline().getContainerName();
+      createContainerForTesting(client, containerName);
 
+      smallFileRequest = ContainerTestHelper.getWriteSmallFileRequest(
+              client.getPipeline(), containerName, keyName, 1024);
 
       response = client.sendCommand(smallFileRequest);
       Assert.assertNotNull(response);
       Assert.assertTrue(smallFileRequest.getTraceID()
           .equals(response.getTraceID()));
 
-      ContainerProtos.ContainerCommandRequestProto getSmallFileRequest =
+      getSmallFileRequest =
           ContainerTestHelper.getReadSmallFileRequest(smallFileRequest
               .getPutSmallFile().getKey());
       response = client.sendCommand(getSmallFileRequest);
@@ -343,58 +306,25 @@ public class TestOzoneContainer {
   public void testCloseContainer() throws Exception {
     MiniOzoneCluster cluster = null;
     XceiverClient client = null;
+    ContainerProtos.ContainerCommandResponseProto response;
+    ContainerProtos.ContainerCommandRequestProto
+        writeChunkRequest, putKeyRequest, request;
     try {
 
-      String keyName = OzoneUtils.getRequestID();
-      String containerName = OzoneUtils.getRequestID();
       OzoneConfiguration conf = new OzoneConfiguration();
-      URL p = conf.getClass().getResource("");
-      String path = p.getPath().concat(
-          TestOzoneContainer.class.getSimpleName());
-      path += conf.getTrimmed(OzoneConfigKeys.OZONE_LOCALSTORAGE_ROOT,
-          OzoneConfigKeys.OZONE_LOCALSTORAGE_ROOT_DEFAULT);
-      conf.set(OzoneConfigKeys.OZONE_LOCALSTORAGE_ROOT, path);
-
-      // Start ozone container Via Datanode create.
-
-      Pipeline pipeline =
-          ContainerTestHelper.createSingleNodePipeline(containerName);
-      conf.setInt(OzoneConfigKeys.DFS_CONTAINER_IPC_PORT,
-          pipeline.getLeader().getContainerPort());
 
+      client = createClientForTesting(conf);
       cluster = new MiniOzoneCluster.Builder(conf)
           .setRandomContainerPort(false)
           .setHandlerType("distributed").build();
-
-      // This client talks to ozone container via datanode.
-      client = new XceiverClient(pipeline, conf);
       client.connect();
 
+      String containerName = client.getPipeline().getContainerName();
+      createContainerForTesting(client, containerName);
+      writeChunkRequest = writeChunkForContainer(client, containerName, 1024);
 
 
-      // Create container
-      ContainerProtos.ContainerCommandRequestProto request =
-          ContainerTestHelper.getCreateContainerRequest(containerName);
-      ContainerProtos.ContainerCommandResponseProto response =
-          client.sendCommand(request);
-      Assert.assertNotNull(response);
-      Assert.assertTrue(request.getTraceID().equals(response.getTraceID()));
-
-      ContainerProtos.ContainerCommandRequestProto writeChunkRequest =
-          ContainerTestHelper.getWriteChunkRequest(pipeline, containerName,
-              keyName, 1024);
-
-      // Write Chunk before closing
-      response = client.sendCommand(writeChunkRequest);
-      Assert.assertNotNull(response);
-      Assert.assertEquals(ContainerProtos.Result.SUCCESS,
-          response.getResult());
-      Assert.assertTrue(writeChunkRequest.getTraceID().equals(response
-          .getTraceID()));
-
-
-      ContainerProtos.ContainerCommandRequestProto putKeyRequest =
-          ContainerTestHelper.getPutKeyRequest(writeChunkRequest
+      putKeyRequest = ContainerTestHelper.getPutKeyRequest(writeChunkRequest
               .getWriteChunk());
       // Put key before closing.
       response = client.sendCommand(putKeyRequest);
@@ -405,7 +335,7 @@ public class TestOzoneContainer {
           putKeyRequest.getTraceID().equals(response.getTraceID()));
 
       // Close the contianer.
-      request = ContainerTestHelper.getCloseContainer(pipeline);
+      request = ContainerTestHelper.getCloseContainer(client.getPipeline());
       response = client.sendCommand(request);
       Assert.assertNotNull(response);
       Assert.assertEquals(ContainerProtos.Result.SUCCESS, response.getResult());
@@ -460,4 +390,133 @@ public class TestOzoneContainer {
       }
     }
   }
+
+  @Test
+  public void testDeleteContainer() throws Exception {
+    MiniOzoneCluster cluster = null;
+    XceiverClient client = null;
+    ContainerProtos.ContainerCommandResponseProto response;
+    ContainerProtos.ContainerCommandRequestProto request,
+        writeChunkRequest, putKeyRequest;
+    try {
+      OzoneConfiguration conf = new OzoneConfiguration();
+
+      client = createClientForTesting(conf);
+      cluster = new MiniOzoneCluster.Builder(conf)
+          .setRandomContainerPort(false)
+          .setHandlerType("distributed").build();
+      client.connect();
+
+      String containerName = client.getPipeline().getContainerName();
+      createContainerForTesting(client, containerName);
+      writeChunkRequest = writeChunkForContainer(client, containerName, 1024);
+
+      putKeyRequest = ContainerTestHelper.getPutKeyRequest(writeChunkRequest
+          .getWriteChunk());
+      // Put key before deleting.
+      response = client.sendCommand(putKeyRequest);
+      Assert.assertNotNull(response);
+      Assert.assertEquals(ContainerProtos.Result.SUCCESS,
+          response.getResult());
+      Assert.assertTrue(
+          putKeyRequest.getTraceID().equals(response.getTraceID()));
+
+      // Container cannot be deleted because the container is not empty.
+      request = ContainerTestHelper.getDeleteContainer(
+          client.getPipeline(), false);
+      response = client.sendCommand(request);
+
+      Assert.assertNotNull(response);
+      Assert.assertEquals(ContainerProtos.Result.ERROR_CONTAINER_NOT_EMPTY,
+          response.getResult());
+      Assert.assertTrue(request.getTraceID().equals(response.getTraceID()));
+
+      // Container cannot be deleted forcibly because
+      // the container is not closed.
+      request = ContainerTestHelper.getDeleteContainer(
+          client.getPipeline(), true);
+      response = client.sendCommand(request);
+
+      Assert.assertNotNull(response);
+      Assert.assertEquals(ContainerProtos.Result.UNCLOSED_CONTAINER_IO,
+          response.getResult());
+      Assert.assertTrue(request.getTraceID().equals(response.getTraceID()));
+
+      // Close the container.
+      request = ContainerTestHelper.getCloseContainer(client.getPipeline());
+      response = client.sendCommand(request);
+      Assert.assertNotNull(response);
+      Assert.assertEquals(ContainerProtos.Result.SUCCESS, response.getResult());
+      Assert.assertTrue(request.getTraceID().equals(response.getTraceID()));
+
+      // Container can be deleted forcibly because
+      // it has been closed.
+      request = ContainerTestHelper.getDeleteContainer(
+          client.getPipeline(), true);
+      response = client.sendCommand(request);
+
+      Assert.assertNotNull(response);
+      Assert.assertEquals(ContainerProtos.Result.SUCCESS,
+          response.getResult());
+      Assert.assertTrue(request.getTraceID().equals(response.getTraceID()));
+
+    } finally {
+      if (client != null) {
+        client.close();
+      }
+      if (cluster != null) {
+        cluster.shutdown();
+      }
+    }
+  }
+
+  private XceiverClient createClientForTesting(OzoneConfiguration conf)
+      throws Exception {
+
+    String containerName = OzoneUtils.getRequestID();
+    URL p = conf.getClass().getResource("");
+    String path = p.getPath().concat(
+        TestOzoneContainer.class.getSimpleName());
+    path += conf.getTrimmed(OzoneConfigKeys.OZONE_LOCALSTORAGE_ROOT,
+        OzoneConfigKeys.OZONE_LOCALSTORAGE_ROOT_DEFAULT);
+    conf.set(OzoneConfigKeys.OZONE_LOCALSTORAGE_ROOT, path);
+
+    // Start ozone container Via Datanode create.
+
+    Pipeline pipeline =
+        ContainerTestHelper.createSingleNodePipeline(containerName);
+    conf.setInt(OzoneConfigKeys.DFS_CONTAINER_IPC_PORT,
+        pipeline.getLeader().getContainerPort());
+
+    // This client talks to ozone container via datanode.
+    return new XceiverClient(pipeline, conf);
+  }
+
+  private static void createContainerForTesting(XceiverClientSpi client,
+      String containerName) throws Exception {
+    // Create container
+    ContainerProtos.ContainerCommandRequestProto request =
+        ContainerTestHelper.getCreateContainerRequest(containerName);
+    ContainerProtos.ContainerCommandResponseProto response =
+        client.sendCommand(request);
+    Assert.assertNotNull(response);
+    Assert.assertTrue(request.getTraceID().equals(response.getTraceID()));
+  }
+
+  private static ContainerProtos.ContainerCommandRequestProto
+      writeChunkForContainer(XceiverClientSpi client,
+      String containerName, int dataLen) throws Exception {
+    // Write Chunk
+    final String keyName = OzoneUtils.getRequestID();
+    ContainerProtos.ContainerCommandRequestProto writeChunkRequest =
+        ContainerTestHelper.getWriteChunkRequest(client.getPipeline(),
+            containerName, keyName, dataLen);
+
+    ContainerProtos.ContainerCommandResponseProto response =
+        client.sendCommand(writeChunkRequest);
+    Assert.assertNotNull(response);
+    Assert.assertEquals(ContainerProtos.Result.SUCCESS, response.getResult());
+    Assert.assertTrue(response.getTraceID().equals(response.getTraceID()));
+    return writeChunkRequest;
+  }
 }


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


Mime
View raw message