You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ozone.apache.org by ad...@apache.org on 2020/04/27 13:23:23 UTC
[hadoop-ozone] branch master updated: HDDS-3455. Change
MiniLoadGenerator to a pluggable model. (#842)
This is an automated email from the ASF dual-hosted git repository.
adoroszlai pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hadoop-ozone.git
The following commit(s) were added to refs/heads/master by this push:
new e4febef HDDS-3455. Change MiniLoadGenerator to a pluggable model. (#842)
e4febef is described below
commit e4febef54dd6c72969bc1d30237b7f3068857112
Author: Mukul Kumar Singh <ms...@apache.org>
AuthorDate: Mon Apr 27 18:53:09 2020 +0530
HDDS-3455. Change MiniLoadGenerator to a pluggable model. (#842)
---
.../hadoop/ozone/MiniOzoneLoadGenerator.java | 110 +++++++++++++--------
.../hadoop/ozone/TestMiniChaosOzoneCluster.java | 24 +++--
.../hadoop/ozone/loadgenerators/LoadExecutors.java | 42 ++++----
.../hadoop/ozone/loadgenerators/LoadGenerator.java | 10 ++
.../ozone/loadgenerators/RandomLoadGenerator.java | 15 ++-
.../loadgenerators/ReadOnlyLoadGenerator.java | 10 +-
.../src/test/resources/log4j.properties | 2 +-
7 files changed, 131 insertions(+), 82 deletions(-)
diff --git a/hadoop-ozone/fault-injection-test/mini-chaos-tests/src/test/java/org/apache/hadoop/ozone/MiniOzoneLoadGenerator.java b/hadoop-ozone/fault-injection-test/mini-chaos-tests/src/test/java/org/apache/hadoop/ozone/MiniOzoneLoadGenerator.java
index 417ac74..b7549ca 100644
--- a/hadoop-ozone/fault-injection-test/mini-chaos-tests/src/test/java/org/apache/hadoop/ozone/MiniOzoneLoadGenerator.java
+++ b/hadoop-ozone/fault-injection-test/mini-chaos-tests/src/test/java/org/apache/hadoop/ozone/MiniOzoneLoadGenerator.java
@@ -20,10 +20,6 @@ package org.apache.hadoop.ozone;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
import org.apache.hadoop.ozone.client.OzoneVolume;
-import org.apache.hadoop.ozone.loadgenerators.FilesystemLoadGenerator;
-import org.apache.hadoop.ozone.loadgenerators.AgedLoadGenerator;
-import org.apache.hadoop.ozone.loadgenerators.RandomLoadGenerator;
-import org.apache.hadoop.ozone.loadgenerators.ReadOnlyLoadGenerator;
import org.apache.hadoop.ozone.loadgenerators.DataBuffer;
import org.apache.hadoop.ozone.loadgenerators.LoadExecutors;
import org.apache.hadoop.ozone.loadgenerators.LoadGenerator;
@@ -33,7 +29,6 @@ import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
-import java.util.function.Function;
import java.util.concurrent.TimeUnit;
/**
@@ -44,66 +39,99 @@ public class MiniOzoneLoadGenerator {
private static final Logger LOG =
LoggerFactory.getLogger(MiniOzoneLoadGenerator.class);
- private final List<LoadExecutors> loadExecutors;
+ private final List<LoadGenerator> loadGenerators;
+ private final LoadExecutors loadExecutor;
private final OzoneVolume volume;
private final OzoneConfiguration conf;
private final String omServiceID;
- MiniOzoneLoadGenerator(OzoneVolume volume, int numClients, int numThreads,
- int numBuffers, OzoneConfiguration conf, String omServiceId)
+ MiniOzoneLoadGenerator(OzoneVolume volume, int numThreads,
+ int numBuffers, OzoneConfiguration conf, String omServiceId,
+ List<Class<? extends LoadGenerator>> loadGenratorClazzes)
throws Exception {
DataBuffer buffer = new DataBuffer(numBuffers);
- loadExecutors = new ArrayList<>();
+ loadGenerators = new ArrayList<>();
this.volume = volume;
this.conf = conf;
this.omServiceID = omServiceId;
- // Random Load
- String mixBucketName = RandomStringUtils.randomAlphabetic(10).toLowerCase();
- volume.createBucket(mixBucketName);
- List<LoadBucket> ozoneBuckets = new ArrayList<>(numClients);
- for (int i = 0; i < numClients; i++) {
- ozoneBuckets.add(new LoadBucket(volume.getBucket(mixBucketName),
- conf, omServiceId));
+ for(Class<? extends LoadGenerator> clazz : loadGenratorClazzes) {
+ addLoads(clazz, buffer);
}
- RandomLoadGenerator loadGenerator =
- new RandomLoadGenerator(buffer, ozoneBuckets);
- loadExecutors.add(new LoadExecutors(numThreads, loadGenerator));
- // Aged Load
- addLoads(numThreads,
- bucket -> new AgedLoadGenerator(buffer, bucket));
-
- //Filesystem Load
- addLoads(numThreads,
- bucket -> new FilesystemLoadGenerator(buffer, bucket));
-
- //Repl Load
- addLoads(numThreads,
- bucket -> new ReadOnlyLoadGenerator(buffer, bucket, 20));
+ this.loadExecutor = new LoadExecutors(numThreads, loadGenerators);
}
- private void addLoads(int numThreads,
- Function<LoadBucket, LoadGenerator> function)
- throws Exception {
+ private void addLoads(Class<? extends LoadGenerator> clazz,
+ DataBuffer buffer) throws Exception {
String bucketName = RandomStringUtils.randomAlphabetic(10).toLowerCase();
volume.createBucket(bucketName);
- LoadBucket bucket = new LoadBucket(volume.getBucket(bucketName), conf,
- omServiceID);
- LoadGenerator loadGenerator = function.apply(bucket);
- loadExecutors.add(new LoadExecutors(numThreads, loadGenerator));
+ LoadBucket ozoneBucket = new LoadBucket(volume.getBucket(bucketName),
+ conf, omServiceID);
+
+ LoadGenerator loadGenerator = clazz
+ .getConstructor(DataBuffer.class, LoadBucket.class)
+ .newInstance(buffer, ozoneBucket);
+ loadGenerators.add(loadGenerator);
}
- void startIO(long time, TimeUnit timeUnit) {
+ void startIO(long time, TimeUnit timeUnit) throws Exception {
LOG.info("Starting MiniOzoneLoadGenerator for time {}:{}", time, timeUnit);
long runTime = timeUnit.toMillis(time);
// start and wait for executors to finish
- loadExecutors.forEach(le -> le.startLoad(runTime));
- loadExecutors.forEach(LoadExecutors::waitForCompletion);
+ loadExecutor.startLoad(runTime);
+ loadExecutor.waitForCompletion();
}
void shutdownLoadGenerator() {
- loadExecutors.forEach(LoadExecutors::shutdown);
+ loadExecutor.shutdown();
+ }
+
+ /**
+ * Builder to create Ozone load generator.
+ */
+ public static class Builder {
+ private List<Class<? extends LoadGenerator>> clazzes = new ArrayList<>();
+ private String omServiceId;
+ private OzoneConfiguration conf;
+ private int numBuffers;
+ private int numThreads;
+ private OzoneVolume volume;
+
+ public Builder addLoadGenerator(Class<? extends LoadGenerator> clazz) {
+ clazzes.add(clazz);
+ return this;
+ }
+
+ public Builder setOMServiceId(String serviceId) {
+ omServiceId = serviceId;
+ return this;
+ }
+
+ public Builder setConf(OzoneConfiguration configuration) {
+ this.conf = configuration;
+ return this;
+ }
+
+ public Builder setNumBuffers(int buffers) {
+ this.numBuffers = buffers;
+ return this;
+ }
+
+ public Builder setNumThreads(int threads) {
+ this.numThreads = threads;
+ return this;
+ }
+
+ public Builder setVolume(OzoneVolume vol) {
+ this.volume = vol;
+ return this;
+ }
+
+ public MiniOzoneLoadGenerator build() throws Exception {
+ return new MiniOzoneLoadGenerator(volume, numThreads, numBuffers,
+ conf, omServiceId, clazzes);
+ }
}
}
diff --git a/hadoop-ozone/fault-injection-test/mini-chaos-tests/src/test/java/org/apache/hadoop/ozone/TestMiniChaosOzoneCluster.java b/hadoop-ozone/fault-injection-test/mini-chaos-tests/src/test/java/org/apache/hadoop/ozone/TestMiniChaosOzoneCluster.java
index e1af53b..5e00523 100644
--- a/hadoop-ozone/fault-injection-test/mini-chaos-tests/src/test/java/org/apache/hadoop/ozone/TestMiniChaosOzoneCluster.java
+++ b/hadoop-ozone/fault-injection-test/mini-chaos-tests/src/test/java/org/apache/hadoop/ozone/TestMiniChaosOzoneCluster.java
@@ -23,6 +23,10 @@ import org.apache.hadoop.hdds.conf.OzoneConfiguration;
import org.apache.hadoop.ozone.client.ObjectStore;
import org.apache.hadoop.ozone.client.OzoneVolume;
import org.apache.hadoop.ozone.MiniOzoneChaosCluster.FailureService;
+import org.apache.hadoop.ozone.loadgenerators.RandomLoadGenerator;
+import org.apache.hadoop.ozone.loadgenerators.ReadOnlyLoadGenerator;
+import org.apache.hadoop.ozone.loadgenerators.FilesystemLoadGenerator;
+import org.apache.hadoop.ozone.loadgenerators.AgedLoadGenerator;
import org.junit.BeforeClass;
import org.junit.AfterClass;
import org.junit.Ignore;
@@ -69,10 +73,6 @@ public class TestMiniChaosOzoneCluster extends GenericCli {
description = "total run time")
private static int numMinutes = 1440; // 1 day by default
- @Option(names = {"-n", "--numClients"},
- description = "no of clients writing to OM")
- private static int numClients = 3;
-
@Option(names = {"-v", "--numDataVolume"},
description = "number of datanode volumes to create")
private static int numDataVolumes = 3;
@@ -107,9 +107,17 @@ public class TestMiniChaosOzoneCluster extends GenericCli {
store.createVolume(volumeName);
OzoneVolume volume = store.getVolume(volumeName);
- loadGenerator =
- new MiniOzoneLoadGenerator(volume, numClients, numThreads,
- numBuffers, configuration, omServiceID);
+ loadGenerator = new MiniOzoneLoadGenerator.Builder()
+ .setVolume(volume)
+ .setConf(configuration)
+ .setNumBuffers(numBuffers)
+ .setNumThreads(numThreads)
+ .setOMServiceId(omServiceID)
+ .addLoadGenerator(RandomLoadGenerator.class)
+ .addLoadGenerator(AgedLoadGenerator.class)
+ .addLoadGenerator(FilesystemLoadGenerator.class)
+ .addLoadGenerator(ReadOnlyLoadGenerator.class)
+ .build();
}
/**
@@ -143,7 +151,7 @@ public class TestMiniChaosOzoneCluster extends GenericCli {
}
@Test
- public void testReadWriteWithChaosCluster() {
+ public void testReadWriteWithChaosCluster() throws Exception {
cluster.startChaos(5, 10, TimeUnit.SECONDS);
loadGenerator.startIO(120, TimeUnit.SECONDS);
}
diff --git a/hadoop-ozone/fault-injection-test/mini-chaos-tests/src/test/java/org/apache/hadoop/ozone/loadgenerators/LoadExecutors.java b/hadoop-ozone/fault-injection-test/mini-chaos-tests/src/test/java/org/apache/hadoop/ozone/loadgenerators/LoadExecutors.java
index da36471..be9507b 100644
--- a/hadoop-ozone/fault-injection-test/mini-chaos-tests/src/test/java/org/apache/hadoop/ozone/loadgenerators/LoadExecutors.java
+++ b/hadoop-ozone/fault-injection-test/mini-chaos-tests/src/test/java/org/apache/hadoop/ozone/loadgenerators/LoadExecutors.java
@@ -18,6 +18,7 @@
package org.apache.hadoop.ozone.loadgenerators;
+import org.apache.commons.lang3.RandomUtils;
import org.apache.hadoop.util.ExitUtil;
import org.apache.hadoop.util.Time;
import org.slf4j.Logger;
@@ -38,30 +39,32 @@ public class LoadExecutors {
private static final Logger LOG =
LoggerFactory.getLogger(LoadExecutors.class);
- private final LoadGenerator generator;
+ private final List<LoadGenerator> generators;
private final int numThreads;
private final ExecutorService executor;
+ private final int numGenerators;
private final List<CompletableFuture<Void>> futures = new ArrayList<>();
- public LoadExecutors(int numThreads, LoadGenerator generator) {
+ public LoadExecutors(int numThreads, List<LoadGenerator> generators) {
this.numThreads = numThreads;
- this.generator = generator;
+ this.generators = generators;
+ this.numGenerators = generators.size();
this.executor = Executors.newFixedThreadPool(numThreads);
}
private void load(long runTimeMillis) {
long threadID = Thread.currentThread().getId();
- LOG.info("{} LOADGEN: Started {} IO Thread:{}.",
- generator, threadID);
+ LOG.info("LOADGEN: Started IO Thread:{}.", threadID);
long startTime = Time.monotonicNow();
while (Time.monotonicNow() - startTime < runTimeMillis) {
+ LoadGenerator gen =
+ generators.get(RandomUtils.nextInt(0, numGenerators));
try {
- generator.generateLoad();
+ gen.generateLoad();
} catch (Throwable t) {
- LOG.error("{} LOADGEN: Exiting due to exception",
- generator, t);
+ LOG.error("{} LOADGEN: Exiting due to exception", gen, t);
ExitUtil.terminate(new ExitUtil.ExitException(1, t));
break;
}
@@ -69,16 +72,21 @@ public class LoadExecutors {
}
- public void startLoad(long time) {
- LOG.info("Starting {} threads for {}", numThreads, generator);
- try {
- generator.initialize();
- for (int i = 0; i < numThreads; i++) {
- futures.add(CompletableFuture.runAsync(
- () -> load(time), executor));
+ public void startLoad(long time) throws Exception {
+ LOG.info("Starting {} threads for {} genrators", numThreads,
+ generators.size());
+ for (LoadGenerator gen : generators) {
+ try {
+ LOG.info("Initializing {} generator", gen);
+ gen.initialize();
+ } catch (Throwable t) {
+ LOG.error("Failed to initialize loadgen:{}", gen, t);
+ throw t;
}
- } catch (Throwable t) {
- LOG.error("Failed to initialize loadgen:{}", generator, t);
+ }
+
+ for (int i = 0; i < numThreads; i++) {
+ futures.add(CompletableFuture.runAsync(() -> load(time), executor));
}
}
diff --git a/hadoop-ozone/fault-injection-test/mini-chaos-tests/src/test/java/org/apache/hadoop/ozone/loadgenerators/LoadGenerator.java b/hadoop-ozone/fault-injection-test/mini-chaos-tests/src/test/java/org/apache/hadoop/ozone/loadgenerators/LoadGenerator.java
index 30bb914..7f79df5 100644
--- a/hadoop-ozone/fault-injection-test/mini-chaos-tests/src/test/java/org/apache/hadoop/ozone/loadgenerators/LoadGenerator.java
+++ b/hadoop-ozone/fault-injection-test/mini-chaos-tests/src/test/java/org/apache/hadoop/ozone/loadgenerators/LoadGenerator.java
@@ -22,6 +22,16 @@ package org.apache.hadoop.ozone.loadgenerators;
* Interface for load generator.
*/
public abstract class LoadGenerator {
+ /*
+ * The implemented LoadGenerators constructors should have the
+ * constructor with the signature as following
+ * class NewLoadGen implements LoadGenerator {
+ *
+ * NewLoadGen(DataBuffer buffer, LoadBucket bucket) {
+ * // Add code here
+ * }
+ * }
+ */
private final String keyNameDelimiter = "_";
diff --git a/hadoop-ozone/fault-injection-test/mini-chaos-tests/src/test/java/org/apache/hadoop/ozone/loadgenerators/RandomLoadGenerator.java b/hadoop-ozone/fault-injection-test/mini-chaos-tests/src/test/java/org/apache/hadoop/ozone/loadgenerators/RandomLoadGenerator.java
index 2889ae1..7d856ac 100644
--- a/hadoop-ozone/fault-injection-test/mini-chaos-tests/src/test/java/org/apache/hadoop/ozone/loadgenerators/RandomLoadGenerator.java
+++ b/hadoop-ozone/fault-injection-test/mini-chaos-tests/src/test/java/org/apache/hadoop/ozone/loadgenerators/RandomLoadGenerator.java
@@ -24,7 +24,6 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.nio.ByteBuffer;
-import java.util.List;
/**
* Random load generator which writes, read and deletes keys from
@@ -34,26 +33,24 @@ public class RandomLoadGenerator extends LoadGenerator {
private static final Logger LOG =
LoggerFactory.getLogger(RandomLoadGenerator.class);
- private final List<LoadBucket> ozoneBuckets;
+ private final LoadBucket ozoneBucket;
private final DataBuffer dataBuffer;
- public RandomLoadGenerator(DataBuffer dataBuffer, List<LoadBucket> buckets) {
- this.ozoneBuckets = buckets;
+ public RandomLoadGenerator(DataBuffer dataBuffer, LoadBucket bucket) {
+ this.ozoneBucket = bucket;
this.dataBuffer = dataBuffer;
}
@Override
public void generateLoad() throws Exception {
- LoadBucket bucket =
- ozoneBuckets.get((int) (Math.random() * ozoneBuckets.size()));
int index = RandomUtils.nextInt();
ByteBuffer buffer = dataBuffer.getBuffer(index);
String keyName = getKeyName(index);
- bucket.writeKey(buffer, keyName);
+ ozoneBucket.writeKey(buffer, keyName);
- bucket.readKey(buffer, keyName);
+ ozoneBucket.readKey(buffer, keyName);
- bucket.deleteKey(keyName);
+ ozoneBucket.deleteKey(keyName);
}
public void initialize() {
diff --git a/hadoop-ozone/fault-injection-test/mini-chaos-tests/src/test/java/org/apache/hadoop/ozone/loadgenerators/ReadOnlyLoadGenerator.java b/hadoop-ozone/fault-injection-test/mini-chaos-tests/src/test/java/org/apache/hadoop/ozone/loadgenerators/ReadOnlyLoadGenerator.java
index 580341d..8397800 100644
--- a/hadoop-ozone/fault-injection-test/mini-chaos-tests/src/test/java/org/apache/hadoop/ozone/loadgenerators/ReadOnlyLoadGenerator.java
+++ b/hadoop-ozone/fault-injection-test/mini-chaos-tests/src/test/java/org/apache/hadoop/ozone/loadgenerators/ReadOnlyLoadGenerator.java
@@ -28,18 +28,16 @@ import java.nio.ByteBuffer;
public class ReadOnlyLoadGenerator extends LoadGenerator {
private final LoadBucket replBucket;
private final DataBuffer dataBuffer;
- private final int numKeys;
+ private final static int NUM_KEYS = 10;
- public ReadOnlyLoadGenerator(DataBuffer dataBuffer, LoadBucket replBucket,
- int numKeys) {
+ public ReadOnlyLoadGenerator(DataBuffer dataBuffer, LoadBucket replBucket) {
this.dataBuffer = dataBuffer;
this.replBucket = replBucket;
- this.numKeys = numKeys;
}
@Override
public void generateLoad() throws Exception {
- int index = RandomUtils.nextInt(0, numKeys);
+ int index = RandomUtils.nextInt(0, NUM_KEYS);
ByteBuffer buffer = dataBuffer.getBuffer(index);
String keyName = getKeyName(index);
replBucket.readKey(buffer, keyName);
@@ -47,7 +45,7 @@ public class ReadOnlyLoadGenerator extends LoadGenerator {
public void initialize() throws Exception {
- for (int index = 0; index < numKeys; index++) {
+ for (int index = 0; index < NUM_KEYS; index++) {
ByteBuffer buffer = dataBuffer.getBuffer(index);
String keyName = getKeyName(index);
replBucket.writeKey(buffer, keyName);
diff --git a/hadoop-ozone/fault-injection-test/mini-chaos-tests/src/test/resources/log4j.properties b/hadoop-ozone/fault-injection-test/mini-chaos-tests/src/test/resources/log4j.properties
index f491fad..c3a1cec 100644
--- a/hadoop-ozone/fault-injection-test/mini-chaos-tests/src/test/resources/log4j.properties
+++ b/hadoop-ozone/fault-injection-test/mini-chaos-tests/src/test/resources/log4j.properties
@@ -24,7 +24,7 @@ log4j.logger.org.apache.hadoop.util.NativeCodeLoader=ERROR
log4j.logger.org.apache.ratis.grpc.client.GrpcClientProtocolClient=WARN
log4j.logger.org.apache.hadoop.ozone.utils=DEBUG,stdout,CHAOS
-log4j.logger.org.apache.hadoop.ozone.loadgenerator=DEBUG,stdout,CHAOS
+log4j.logger.org.apache.hadoop.ozone.loadgenerators=DEBUG,stdout,CHAOS
log4j.appender.CHAOS.File=${chaoslogfilename}
log4j.appender.CHAOS=org.apache.log4j.FileAppender
log4j.appender.CHAOS.layout=org.apache.log4j.PatternLayout
---------------------------------------------------------------------
To unsubscribe, e-mail: ozone-commits-unsubscribe@hadoop.apache.org
For additional commands, e-mail: ozone-commits-help@hadoop.apache.org