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

shashikant 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 c550a84  HDDS-5468. Avoid long sleep in TestPeriodicVolumeChecker 
(#2445)
c550a84 is described below

commit c550a8449db91c8112032674097b48f0ad6c82c7
Author: Doroszlai, Attila <[email protected]>
AuthorDate: Thu Jul 22 16:54:53 2021 +0200

    HDDS-5468. Avoid long sleep in TestPeriodicVolumeChecker (#2445)
---
 .../common/volume/ImmutableVolumeSet.java          | 16 ++++
 .../container/common/volume/MutableVolumeSet.java  | 10 ++-
 .../common/volume/StorageVolumeChecker.java        |  9 +--
 .../ozone/container/common/volume/VolumeSet.java   |  3 +
 .../common/volume/TestPeriodicVolumeChecker.java   | 89 +++++++++++++---------
 5 files changed, 82 insertions(+), 45 deletions(-)

diff --git 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/ImmutableVolumeSet.java
 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/ImmutableVolumeSet.java
index e5cd341..f291f4e 100644
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/ImmutableVolumeSet.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/ImmutableVolumeSet.java
@@ -19,6 +19,8 @@ package org.apache.hadoop.ozone.container.common.volume;
 
 import com.google.common.collect.ImmutableList;
 
+import java.io.IOException;
+import java.util.Collection;
 import java.util.List;
 
 /**
@@ -32,12 +34,26 @@ public final class ImmutableVolumeSet implements VolumeSet {
     this.volumes = ImmutableList.copyOf(volumes);
   }
 
+  public ImmutableVolumeSet(Collection<? extends StorageVolume> volumes) {
+    this.volumes = ImmutableList.copyOf(volumes);
+  }
+
   @Override
   public List<StorageVolume> getVolumesList() {
     return volumes;
   }
 
   @Override
+  public void checkAllVolumes(StorageVolumeChecker checker) throws IOException 
{
+    try {
+      checker.checkAllVolumes(volumes);
+    } catch (InterruptedException e) {
+      Thread.currentThread().interrupt();
+      throw new IOException("Interrupted while running disk check", e);
+    }
+  }
+
+  @Override
   public void readLock() {
     // no-op, immutable
   }
diff --git 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/MutableVolumeSet.java
 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/MutableVolumeSet.java
index 47fe4e3..97adc8f 100644
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/MutableVolumeSet.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/MutableVolumeSet.java
@@ -217,7 +217,13 @@ public class MutableVolumeSet implements VolumeSet {
    * failed volumes.
    */
   public void checkAllVolumes() throws IOException {
-    if (volumeChecker == null) {
+    checkAllVolumes(volumeChecker);
+  }
+
+  @Override
+  public void checkAllVolumes(StorageVolumeChecker checker)
+      throws IOException {
+    if (checker == null) {
       LOG.debug("No volumeChecker, skip checkAllVolumes");
       return;
     }
@@ -225,7 +231,7 @@ public class MutableVolumeSet implements VolumeSet {
     List<StorageVolume> allVolumes = getVolumesList();
     Set<? extends StorageVolume> failedVolumes;
     try {
-      failedVolumes = volumeChecker.checkAllVolumes(allVolumes);
+      failedVolumes = checker.checkAllVolumes(allVolumes);
     } catch (InterruptedException e) {
       Thread.currentThread().interrupt();
       throw new IOException("Interrupted while running disk check", e);
diff --git 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/StorageVolumeChecker.java
 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/StorageVolumeChecker.java
index ce2fb59..2f3871d 100644
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/StorageVolumeChecker.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/StorageVolumeChecker.java
@@ -96,8 +96,7 @@ public class StorageVolumeChecker {
    */
   private final ScheduledExecutorService diskCheckerservice;
   private final ScheduledFuture<?> periodicDiskChecker;
-
-  private List<MutableVolumeSet> registeredVolumeSets;
+  private final List<VolumeSet> registeredVolumeSets;
 
   /**
    * @param conf  Configuration object.
@@ -146,7 +145,7 @@ public class StorageVolumeChecker {
             TimeUnit.MINUTES);
   }
 
-  public synchronized void registerVolumeSet(MutableVolumeSet volumeSet) {
+  public synchronized void registerVolumeSet(VolumeSet volumeSet) {
     registeredVolumeSets.add(volumeSet);
   }
 
@@ -164,8 +163,8 @@ public class StorageVolumeChecker {
     }
 
     try {
-      for (MutableVolumeSet volSet : registeredVolumeSets) {
-        volSet.checkAllVolumes();
+      for (VolumeSet volSet : registeredVolumeSets) {
+        volSet.checkAllVolumes(this);
       }
 
       lastAllVolumeSetsCheckComplete = timer.monotonicNow();
diff --git 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/VolumeSet.java
 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/VolumeSet.java
index 5a4af0c..2486547 100644
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/VolumeSet.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/VolumeSet.java
@@ -19,6 +19,7 @@ package org.apache.hadoop.ozone.container.common.volume;
 
 import org.apache.hadoop.ozone.lock.ReadWriteLockable;
 
+import java.io.IOException;
 import java.util.List;
 
 /**
@@ -26,4 +27,6 @@ import java.util.List;
  */
 public interface VolumeSet extends ReadWriteLockable {
   List<StorageVolume> getVolumesList();
+
+  void checkAllVolumes(StorageVolumeChecker checker) throws IOException;
 }
diff --git 
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/volume/TestPeriodicVolumeChecker.java
 
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/volume/TestPeriodicVolumeChecker.java
index ba7babd..1d82424 100644
--- 
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/volume/TestPeriodicVolumeChecker.java
+++ 
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/volume/TestPeriodicVolumeChecker.java
@@ -20,12 +20,10 @@ package org.apache.hadoop.ozone.container.common.volume;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.hadoop.hdds.conf.OzoneConfiguration;
-import org.apache.hadoop.hdds.protocol.DatanodeDetails;
 import org.apache.hadoop.hdds.scm.ScmConfigKeys;
 import org.apache.hadoop.ozone.OzoneConfigKeys;
-import org.apache.hadoop.ozone.container.common.ContainerTestUtils;
 import 
org.apache.hadoop.ozone.container.common.statemachine.DatanodeConfiguration;
-import org.apache.hadoop.ozone.container.ozoneimpl.OzoneContainer;
+import org.apache.hadoop.util.FakeTimer;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
@@ -39,6 +37,10 @@ import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
 import java.time.Duration;
+import java.util.concurrent.TimeUnit;
+
+import static 
org.apache.hadoop.hdfs.server.datanode.checker.VolumeCheckResult.HEALTHY;
+import static 
org.apache.hadoop.ozone.container.common.volume.TestStorageVolumeChecker.makeVolumes;
 
 /**
  * Test periodic volume checker in StorageVolumeChecker.
@@ -79,40 +81,51 @@ public class TestPeriodicVolumeChecker {
 
     DatanodeConfiguration dnConf =
         conf.getObject(DatanodeConfiguration.class);
-    dnConf.setDiskCheckMinGap(Duration.ofMinutes(2));
-    dnConf.setPeriodicDiskCheckIntervalMinutes(1);
-    conf.setFromObject(dnConf);
-
-    DatanodeDetails datanodeDetails =
-        ContainerTestUtils.createDatanodeDetails();
-    OzoneContainer ozoneContainer =
-        ContainerTestUtils.getOzoneContainer(datanodeDetails, conf);
-    MutableVolumeSet dataVolumeSet = ozoneContainer.getVolumeSet();
-
-    StorageVolumeChecker volumeChecker = dataVolumeSet.getVolumeChecker();
-    volumeChecker.setDelegateChecker(
-        new TestStorageVolumeChecker.DummyChecker());
-
-    // 1 for volumeSet and 1 for metadataVolumeSet
-    // in MutableVolumeSet constructor
-    Assert.assertEquals(2, volumeChecker.getNumAllVolumeChecks());
-    Assert.assertEquals(0, volumeChecker.getNumAllVolumeSetsChecks());
-
-    // wait for periodic disk checker start
-    Thread.sleep((60 + 5) * 1000);
-
-    // first round
-    // 2 for volumeSet and 2 for metadataVolumeSet
-    Assert.assertEquals(4, volumeChecker.getNumAllVolumeChecks());
-    Assert.assertEquals(1, volumeChecker.getNumAllVolumeSetsChecks());
-    Assert.assertEquals(0, volumeChecker.getNumSkippedChecks());
-
-    // wait for periodic disk checker next round
-    Thread.sleep((60 + 5) * 1000);
-
-    // skipped next round
-    Assert.assertEquals(4, volumeChecker.getNumAllVolumeChecks());
-    Assert.assertEquals(1, volumeChecker.getNumAllVolumeSetsChecks());
-    Assert.assertEquals(1, volumeChecker.getNumSkippedChecks());
+    Duration gap = dnConf.getDiskCheckMinGap();
+    Duration interval = Duration.ofMinutes(
+        dnConf.getPeriodicDiskCheckIntervalMinutes());
+
+    FakeTimer timer = new FakeTimer();
+
+    StorageVolumeChecker volumeChecker = new StorageVolumeChecker(conf, timer);
+
+    try {
+      volumeChecker.registerVolumeSet(new ImmutableVolumeSet(makeVolumes(
+          2, HEALTHY)));
+      volumeChecker.registerVolumeSet(new ImmutableVolumeSet(makeVolumes(
+          1, HEALTHY)));
+      volumeChecker.setDelegateChecker(
+          new TestStorageVolumeChecker.DummyChecker());
+
+      Assert.assertEquals(0, volumeChecker.getNumAllVolumeChecks());
+      Assert.assertEquals(0, volumeChecker.getNumAllVolumeSetsChecks());
+
+      // first round
+      timer.advance(gap.toMillis() / 3);
+      volumeChecker.checkAllVolumeSets();
+
+      Assert.assertEquals(2, volumeChecker.getNumAllVolumeChecks());
+      Assert.assertEquals(1, volumeChecker.getNumAllVolumeSetsChecks());
+      Assert.assertEquals(0, volumeChecker.getNumSkippedChecks());
+
+      // periodic disk checker next round within gap
+      timer.advance(gap.toMillis() / 3);
+      volumeChecker.checkAllVolumeSets();
+
+      // skipped next round
+      Assert.assertEquals(2, volumeChecker.getNumAllVolumeChecks());
+      Assert.assertEquals(1, volumeChecker.getNumAllVolumeSetsChecks());
+      Assert.assertEquals(1, volumeChecker.getNumSkippedChecks());
+
+      // periodic disk checker next round
+      timer.advance(interval.toMillis());
+      volumeChecker.checkAllVolumeSets();
+
+      Assert.assertEquals(4, volumeChecker.getNumAllVolumeChecks());
+      Assert.assertEquals(2, volumeChecker.getNumAllVolumeSetsChecks());
+      Assert.assertEquals(1, volumeChecker.getNumSkippedChecks());
+    } finally {
+      volumeChecker.shutdownAndWait(1, TimeUnit.SECONDS);
+    }
   }
 }

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

Reply via email to