You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ozone.apache.org by sa...@apache.org on 2021/04/06 12:25:47 UTC

[ozone] branch master updated: HDDS-5032. DN stopped to load containers on volume after a container load exception. (#2109)

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

sammichen 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 c0b40f7  HDDS-5032. DN stopped to load containers on volume after a container load exception. (#2109)
c0b40f7 is described below

commit c0b40f7d2c78310fb0fe34163fd276e1afeb79a9
Author: Sammi Chen <sa...@apache.org>
AuthorDate: Tue Apr 6 20:25:22 2021 +0800

    HDDS-5032. DN stopped to load containers on volume after a container load exception. (#2109)
---
 .../ozone/container/ozoneimpl/ContainerReader.java | 22 +++++++----
 .../container/ozoneimpl/TestContainerReader.java   | 43 ++++++++++++++++++++++
 2 files changed, 57 insertions(+), 8 deletions(-)

diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/ozoneimpl/ContainerReader.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/ozoneimpl/ContainerReader.java
index 1ab4c3b..99ed9a0 100644
--- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/ozoneimpl/ContainerReader.java
+++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/ozoneimpl/ContainerReader.java
@@ -150,14 +150,20 @@ public class ContainerReader implements Runnable {
             File[] containerDirs = containerTopDir.listFiles();
             if (containerDirs != null) {
               for (File containerDir : containerDirs) {
-                File containerFile = ContainerUtils.getContainerFile(
-                    containerDir);
-                long containerID = ContainerUtils.getContainerID(containerDir);
-                if (containerFile.exists()) {
-                  verifyContainerFile(storageLoc, containerID, containerFile);
-                } else {
-                  LOG.error("Missing .container file for ContainerID: {}",
-                      containerDir.getName());
+                try {
+                  File containerFile = ContainerUtils.getContainerFile(
+                      containerDir);
+                  long containerID =
+                      ContainerUtils.getContainerID(containerDir);
+                  if (containerFile.exists()) {
+                    verifyContainerFile(storageLoc, containerID, containerFile);
+                  } else {
+                    LOG.error("Missing .container file for ContainerID: {}",
+                        containerDir.getName());
+                  }
+                } catch (Throwable e) {
+                  LOG.error("Failed to load container from {}",
+                      containerDir.getAbsolutePath(), e);
                 }
               }
             }
diff --git a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestContainerReader.java b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestContainerReader.java
index be261d0..849c56a 100644
--- a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestContainerReader.java
+++ b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestContainerReader.java
@@ -214,6 +214,49 @@ public class TestContainerReader {
   }
 
   @Test
+  public void testContainerReaderWithLoadException() throws Exception {
+    MutableVolumeSet volumeSet1;
+    HddsVolume hddsVolume1;
+    ContainerSet containerSet1 = new ContainerSet();
+    File volumeDir1 = tempDir.newFolder();
+    RoundRobinVolumeChoosingPolicy volumeChoosingPolicy1;
+
+    volumeSet1 = Mockito.mock(MutableVolumeSet.class);
+    UUID datanode = UUID.randomUUID();
+    hddsVolume1 = new HddsVolume.Builder(volumeDir1
+        .getAbsolutePath()).conf(conf).datanodeUuid(datanode
+        .toString()).clusterID(clusterId).build();
+    volumeChoosingPolicy1 = mock(RoundRobinVolumeChoosingPolicy.class);
+    Mockito.when(volumeChoosingPolicy1.chooseVolume(anyList(), anyLong()))
+        .thenReturn(hddsVolume1);
+
+    int containerCount = 3;
+    for (int i = 0; i < containerCount; i++) {
+      KeyValueContainerData keyValueContainerData = new KeyValueContainerData(i,
+          ChunkLayOutVersion.FILE_PER_BLOCK,
+          (long) StorageUnit.GB.toBytes(5), UUID.randomUUID().toString(),
+          datanodeId.toString());
+      KeyValueContainer keyValueContainer =
+          new KeyValueContainer(keyValueContainerData, conf);
+      keyValueContainer.create(volumeSet1, volumeChoosingPolicy1, clusterId);
+      BlockUtils.removeDB(keyValueContainerData, conf);
+
+      if (i == 0) {
+        // rename first container directory name
+        String containerPathStr =
+            keyValueContainer.getContainerData().getContainerPath();
+        File containerPath = new File(containerPathStr);
+        String renamePath = containerPathStr + "-aa";
+        containerPath.renameTo(new File(renamePath));
+      }
+    }
+
+    ContainerReader containerReader = new ContainerReader(volumeSet1,
+        hddsVolume1, containerSet1, conf);
+    containerReader.readVolume(hddsVolume1.getHddsRootDir());
+    Assert.assertEquals(containerCount - 1, containerSet1.containerCount());
+  }
+  @Test
   public void testMultipleContainerReader() throws Exception {
     final int volumeNum = 10;
     StringBuffer datanodeDirs = new StringBuffer();

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