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]