Quellcode durchsuchen

HDDS-257. Hook up VolumeSet#shutdown from HddsDispatcher#shutdown. Contributed by Hanisha Koneru

Bharat Viswanadham vor 6 Jahren
Ursprung
Commit
ba25d27ddb

+ 2 - 0
hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/impl/HddsDispatcher.java

@@ -81,6 +81,8 @@ public class HddsDispatcher implements ContainerDispatcher {
 
   @Override
   public void shutdown() {
+    // Shutdown the volumes
+    volumeSet.shutdown();
   }
 
   @Override

+ 0 - 2
hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/HddsVolume.java

@@ -370,6 +370,4 @@ public final class HddsVolume {
   public void setScmUsageForTesting(GetSpaceUsed scmUsageForTest) {
     volumeInfo.setScmUsageForTesting(scmUsageForTest);
   }
-
-
 }

+ 8 - 0
hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/VolumeInfo.java

@@ -129,4 +129,12 @@ public class VolumeInfo {
   public void setScmUsageForTesting(GetSpaceUsed scmUsageForTest) {
     usage.setScmUsageForTesting(scmUsageForTest);
   }
+
+  /**
+   * Only for testing. Do not use otherwise.
+   */
+  @VisibleForTesting
+  public VolumeUsage getUsageForTesting() {
+    return usage;
+  }
 }

+ 17 - 1
hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/VolumeSet.java

@@ -23,9 +23,11 @@ import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.StorageType;
-import org.apache.hadoop.hdds.protocol.DatanodeDetails;
+
 import static org.apache.hadoop.hdds.scm.ScmConfigKeys.HDDS_DATANODE_DIR_KEY;
 import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_DATANODE_DATA_DIR_KEY;
+import static org.apache.hadoop.util.RunJar.SHUTDOWN_HOOK_PRIORITY;
+
 import org.apache.hadoop.hdfs.server.datanode.StorageLocation;
 import org.apache.hadoop.hdds.protocol.proto
     .StorageContainerDatanodeProtocolProtos;
@@ -40,6 +42,7 @@ import org.apache.hadoop.ozone.container.common.interfaces.VolumeChoosingPolicy;
 import org.apache.hadoop.util.AutoCloseableLock;
 import org.apache.hadoop.util.DiskChecker.DiskOutOfSpaceException;
 import org.apache.hadoop.util.InstrumentedLock;
+import org.apache.hadoop.util.ShutdownHookManager;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -89,6 +92,8 @@ public class VolumeSet {
   private final String datanodeUuid;
   private String clusterID;
 
+  private Runnable shutdownHook;
+
   public VolumeSet(String dnUuid, Configuration conf)
       throws DiskOutOfSpaceException {
     this(dnUuid, null, conf);
@@ -155,6 +160,13 @@ public class VolumeSet {
     if (volumeMap.size() == 0) {
       throw new DiskOutOfSpaceException("No storage location configured");
     }
+
+    // Ensure volume threads are stopped and scm df is saved during shutdown.
+    shutdownHook = () -> {
+      shutdown();
+    };
+    ShutdownHookManager.get().addShutdownHook(shutdownHook,
+        SHUTDOWN_HOOK_PRIORITY);
   }
 
   /**
@@ -296,6 +308,10 @@ public class VolumeSet {
             ex);
       }
     }
+
+    if (shutdownHook != null) {
+      ShutdownHookManager.get().removeShutdownHook(shutdownHook);
+    }
   }
 
   @VisibleForTesting

+ 0 - 17
hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/VolumeUsage.java

@@ -24,8 +24,6 @@ import org.apache.hadoop.fs.CachingGetSpaceUsed;
 import org.apache.hadoop.fs.DF;
 import org.apache.hadoop.fs.GetSpaceUsed;
 import org.apache.hadoop.io.IOUtils;
-import static org.apache.hadoop.util.RunJar.SHUTDOWN_HOOK_PRIORITY;
-import org.apache.hadoop.util.ShutdownHookManager;
 import org.apache.hadoop.util.Time;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -49,7 +47,6 @@ public class VolumeUsage {
   private final DF df;
   private final File scmUsedFile;
   private GetSpaceUsed scmUsage;
-  private Runnable shutdownHook;
 
   private static final String DU_CACHE_FILE = "scmUsed";
   private volatile boolean scmUsedSaved = false;
@@ -72,15 +69,6 @@ public class VolumeUsage {
         .setConf(conf)
         .setInitialUsed(loadScmUsed())
         .build();
-
-    // Ensure scm df is saved during shutdown.
-    shutdownHook = () -> {
-      if (!scmUsedSaved) {
-        saveScmUsed();
-      }
-    };
-    ShutdownHookManager.get().addShutdownHook(shutdownHook,
-        SHUTDOWN_HOOK_PRIORITY);
   }
 
   long getCapacity() {
@@ -106,11 +94,6 @@ public class VolumeUsage {
 
   public void shutdown() {
     saveScmUsed();
-    scmUsedSaved = true;
-
-    if (shutdownHook != null) {
-      ShutdownHookManager.get().removeShutdownHook(shutdownHook);
-    }
 
     if (scmUsage instanceof CachingGetSpaceUsed) {
       IOUtils.cleanupWithLogger(null, ((CachingGetSpaceUsed) scmUsage));

+ 23 - 3
hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/volume/TestVolumeSet.java

@@ -34,8 +34,10 @@ import static org.apache.hadoop.ozone.container.common.volume.HddsVolume
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 import org.junit.After;
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -87,6 +89,7 @@ public class TestVolumeSet {
     for (HddsVolume volume : volumes) {
       FileUtils.deleteDirectory(volume.getHddsRootDir());
     }
+    volumeSet.shutdown();
   }
 
   private boolean checkVolumeExistsInVolumeSet(String volume) {
@@ -120,9 +123,6 @@ public class TestVolumeSet {
 
     // Add a volume to VolumeSet
     String volume3 = baseDir + "disk3";
-//    File dir3 = new File(volume3, "hdds");
-//    File[] files = dir3.listFiles();
-//    System.out.println("------ " + files[0].getPath());
     boolean success = volumeSet.addVolume(volume3);
 
     assertTrue(success);
@@ -204,4 +204,24 @@ public class TestVolumeSet {
     File volume = new File(volume3);
     FileUtils.deleteDirectory(volume);
   }
+
+  @Test
+  public void testShutdown() throws Exception {
+    List<HddsVolume> volumesList = volumeSet.getVolumesList();
+
+    volumeSet.shutdown();
+
+    // Verify that the volumes are shutdown and the volumeUsage is set to null.
+    for (HddsVolume volume : volumesList) {
+      Assert.assertNull(volume.getVolumeInfo().getUsageForTesting());
+      try {
+        // getAvailable() should throw null pointer exception as usage is null.
+        volume.getAvailable();
+        fail("Volume shutdown failed.");
+      } catch (NullPointerException ex) {
+        // Do Nothing. Exception is expected.
+      }
+    }
+
+  }
 }