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

agupta 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 e89fee375e HDDS-9658. NPE while cleanup deleted container data (#5964)
e89fee375e is described below

commit e89fee375efb1aaeb59978c1c708b6808e38b267
Author: Sumit Agrawal <[email protected]>
AuthorDate: Wed Jan 31 20:34:45 2024 +0530

    HDDS-9658. NPE while cleanup deleted container data (#5964)
---
 .../ozone/container/ozoneimpl/ContainerReader.java   | 20 ++++++++++++--------
 .../ozone/container/ozoneimpl/OzoneContainer.java    |  8 +++++---
 .../container/ozoneimpl/TestContainerReader.java     |  4 +++-
 .../container/ozoneimpl/TestOzoneContainer.java      |  1 +
 .../rpc/TestContainerStateMachineFailures.java       |  2 +-
 5 files changed, 22 insertions(+), 13 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 edbff14aca..1685d1c5fe 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
@@ -78,18 +78,18 @@ public class ContainerReader implements Runnable {
   private final ConfigurationSource config;
   private final File hddsVolumeDir;
   private final MutableVolumeSet volumeSet;
-  private final boolean shouldDeleteRecovering;
+  private final boolean shouldDelete;
 
   public ContainerReader(
       MutableVolumeSet volSet, HddsVolume volume, ContainerSet cset,
-      ConfigurationSource conf, boolean shouldDeleteRecovering) {
+      ConfigurationSource conf, boolean shouldDelete) {
     Preconditions.checkNotNull(volume);
     this.hddsVolume = volume;
     this.hddsVolumeDir = hddsVolume.getHddsRootDir();
     this.containerSet = cset;
     this.config = conf;
     this.volumeSet = volSet;
-    this.shouldDeleteRecovering = shouldDeleteRecovering;
+    this.shouldDelete = shouldDelete;
   }
 
   @Override
@@ -148,7 +148,7 @@ public class ContainerReader implements Runnable {
       LOG.info("Start to verify containers on volume {}", hddsVolumeRootDir);
       File currentDir = new File(idDir, Storage.STORAGE_DIR_CURRENT);
       File[] containerTopDirs = currentDir.listFiles();
-      if (containerTopDirs != null) {
+      if (containerTopDirs != null && containerTopDirs.length > 0) {
         for (File containerTopDir : containerTopDirs) {
           if (containerTopDir.isDirectory()) {
             File[] containerDirs = containerTopDir.listFiles();
@@ -214,7 +214,7 @@ public class ContainerReader implements Runnable {
         KeyValueContainer kvContainer = new KeyValueContainer(kvContainerData,
             config);
         if (kvContainer.getContainerState() == RECOVERING) {
-          if (shouldDeleteRecovering) {
+          if (shouldDelete) {
             kvContainer.markContainerUnhealthy();
             LOG.info("Stale recovering container {} marked UNHEALTHY",
                 kvContainerData.getContainerID());
@@ -223,7 +223,9 @@ public class ContainerReader implements Runnable {
           return;
         }
         if (kvContainer.getContainerState() == DELETED) {
-          cleanupContainer(hddsVolume, kvContainer);
+          if (shouldDelete) {
+            cleanupContainer(hddsVolume, kvContainer);
+          }
           return;
         }
         try {
@@ -232,8 +234,10 @@ public class ContainerReader implements Runnable {
           if (e.getResult() != ContainerProtos.Result.CONTAINER_EXISTS) {
             throw e;
           }
-          resolveDuplicate((KeyValueContainer) containerSet.getContainer(
-              kvContainer.getContainerData().getContainerID()), kvContainer);
+          if (shouldDelete) {
+            resolveDuplicate((KeyValueContainer) containerSet.getContainer(
+                kvContainer.getContainerData().getContainerID()), kvContainer);
+          }
         }
       } else {
         throw new StorageContainerException("Container File is corrupted. " +
diff --git 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/ozoneimpl/OzoneContainer.java
 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/ozoneimpl/OzoneContainer.java
index d4425f75a5..aef3965dcd 100644
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/ozoneimpl/OzoneContainer.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/ozoneimpl/OzoneContainer.java
@@ -169,7 +169,6 @@ public class OzoneContainer {
     containerSet = new ContainerSet(recoveringContainerTimeout);
     metadataScanner = null;
 
-    buildContainerSet();
     metrics = ContainerMetrics.create(conf);
     handlers = Maps.newHashMap();
 
@@ -286,9 +285,10 @@ public class OzoneContainer {
   }
 
   /**
-   * Build's container map.
+   * Build's container map after volume format.
    */
-  private void buildContainerSet() {
+  @VisibleForTesting
+  public void buildContainerSet() {
     Iterator<StorageVolume> volumeSetIterator = volumeSet.getVolumesList()
         .iterator();
     ArrayList<Thread> volumeThreads = new ArrayList<>();
@@ -442,6 +442,8 @@ public class OzoneContainer {
       return;
     }
 
+    buildContainerSet();
+
     // Start background volume checks, which will begin after the configured
     // delay.
     volumeChecker.start();
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 3f5adef35d..7f38eab785 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
@@ -558,8 +558,10 @@ public class TestContainerReader {
       // add db entry for the container ID 101 for V3
       baseCount = addDbEntry(containerData);
     }
+
+    // verify container data and perform cleanup
     ContainerReader containerReader = new ContainerReader(volumeSet,
-        hddsVolume, containerSet, conf, false);
+        hddsVolume, containerSet, conf, true);
 
     containerReader.run();
 
diff --git 
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestOzoneContainer.java
 
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestOzoneContainer.java
index af6bd5d17f..497418dcdc 100644
--- 
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestOzoneContainer.java
+++ 
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestOzoneContainer.java
@@ -153,6 +153,7 @@ public class TestOzoneContainer {
     OzoneContainer ozoneContainer = ContainerTestUtils
         .getOzoneContainer(datanodeDetails, conf);
 
+    ozoneContainer.buildContainerSet();
     ContainerSet containerset = ozoneContainer.getContainerSet();
     assertEquals(numTestContainers, containerset.containerCount());
 
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestContainerStateMachineFailures.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestContainerStateMachineFailures.java
index 5a2d67960f..2a316cdedd 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestContainerStateMachineFailures.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestContainerStateMachineFailures.java
@@ -376,7 +376,7 @@ public class TestContainerStateMachineFailures {
     int index = cluster.getHddsDatanodeIndex(dn.getDatanodeDetails());
     // restart the hdds datanode and see if the container is listed in the
     // in the missing container set and not in the regular set
-    cluster.restartHddsDatanode(dn.getDatanodeDetails(), false);
+    cluster.restartHddsDatanode(dn.getDatanodeDetails(), true);
     // make sure the container state is still marked unhealthy after restart
     keyValueContainerData = (KeyValueContainerData) ContainerDataYaml
         .readContainerFile(containerFile);


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to