Skip to content
Snippets Groups Projects
Commit ffe78ce0 authored by Sören Henning's avatar Sören Henning
Browse files

Introduce new workload generator based on Hazelcast

parent fcc9b6c9
No related branches found
No related tags found
No related merge requests found
Showing
with 113 additions and 20 deletions
...@@ -11,11 +11,11 @@ import java.util.function.BiConsumer; ...@@ -11,11 +11,11 @@ import java.util.function.BiConsumer;
import java.util.function.BiFunction; import java.util.function.BiFunction;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import theodolite.commons.workloadgeneration.KeySpace;
import theodolite.commons.workloadgeneration.communication.zookeeper.WorkloadDistributor; import theodolite.commons.workloadgeneration.communication.zookeeper.WorkloadDistributor;
import theodolite.commons.workloadgeneration.dimensions.KeySpace;
import theodolite.commons.workloadgeneration.functions.BeforeAction; import theodolite.commons.workloadgeneration.functions.BeforeAction;
import theodolite.commons.workloadgeneration.functions.MessageGenerator; import theodolite.commons.workloadgeneration.functions.RecordGenerator;
import theodolite.commons.workloadgeneration.functions.Transport; import theodolite.commons.workloadgeneration.functions.RecordSender;
import theodolite.commons.workloadgeneration.misc.WorkloadDefinition; import theodolite.commons.workloadgeneration.misc.WorkloadDefinition;
import theodolite.commons.workloadgeneration.misc.WorkloadEntity; import theodolite.commons.workloadgeneration.misc.WorkloadEntity;
import theodolite.commons.workloadgeneration.misc.ZooKeeper; import theodolite.commons.workloadgeneration.misc.ZooKeeper;
...@@ -35,8 +35,8 @@ public abstract class AbstractWorkloadGenerator<T> ...@@ -35,8 +35,8 @@ public abstract class AbstractWorkloadGenerator<T>
private final KeySpace keySpace;// NOPMD keep instance variable instead of local variable private final KeySpace keySpace;// NOPMD keep instance variable instead of local variable
private final BeforeAction beforeAction; // NOPMD keep instance variable instead of local variable private final BeforeAction beforeAction; // NOPMD keep instance variable instead of local variable
private final BiFunction<WorkloadDefinition, Integer, List<WorkloadEntity<T>>> workloadSelector; private final BiFunction<WorkloadDefinition, Integer, List<WorkloadEntity<T>>> workloadSelector;
private final MessageGenerator<T> generatorFunction; private final RecordGenerator<T> generatorFunction;
private final Transport<T> transport; private final RecordSender<T> transport;
private WorkloadDistributor workloadDistributor; // NOPMD keep instance variable instead of local private WorkloadDistributor workloadDistributor; // NOPMD keep instance variable instead of local
private final ScheduledExecutorService executor; private final ScheduledExecutorService executor;
...@@ -61,8 +61,8 @@ public abstract class AbstractWorkloadGenerator<T> ...@@ -61,8 +61,8 @@ public abstract class AbstractWorkloadGenerator<T>
final Duration period, final Duration period,
final Duration duration, final Duration duration,
final BeforeAction beforeAction, final BeforeAction beforeAction,
final MessageGenerator<T> generatorFunction, final RecordGenerator<T> generatorFunction,
final Transport<T> transport) { final RecordSender<T> transport) {
this.instances = instances; this.instances = instances;
this.zooKeeper = zooKeeper; this.zooKeeper = zooKeeper;
this.keySpace = keySpace; this.keySpace = keySpace;
...@@ -99,7 +99,7 @@ public abstract class AbstractWorkloadGenerator<T> ...@@ -99,7 +99,7 @@ public abstract class AbstractWorkloadGenerator<T>
entities.forEach(entity -> { entities.forEach(entity -> {
final long initialDelay = random.nextInt(periodMs); final long initialDelay = random.nextInt(periodMs);
final Runnable task = () -> this.transport.transport(entity.generateMessage()); final Runnable task = () -> this.transport.send(entity.generateMessage());
this.executor.scheduleAtFixedRate(task, initialDelay, periodMs, TimeUnit.MILLISECONDS); this.executor.scheduleAtFixedRate(task, initialDelay, periodMs, TimeUnit.MILLISECONDS);
}); });
......
...@@ -2,10 +2,10 @@ package theodolite.commons.workloadgeneration.generators; ...@@ -2,10 +2,10 @@ package theodolite.commons.workloadgeneration.generators;
import java.time.Duration; import java.time.Duration;
import org.apache.avro.specific.SpecificRecord; import org.apache.avro.specific.SpecificRecord;
import theodolite.commons.workloadgeneration.KeySpace;
import theodolite.commons.workloadgeneration.communication.kafka.KafkaRecordSender; import theodolite.commons.workloadgeneration.communication.kafka.KafkaRecordSender;
import theodolite.commons.workloadgeneration.dimensions.KeySpace;
import theodolite.commons.workloadgeneration.functions.BeforeAction; import theodolite.commons.workloadgeneration.functions.BeforeAction;
import theodolite.commons.workloadgeneration.functions.MessageGenerator; import theodolite.commons.workloadgeneration.functions.RecordGenerator;
import theodolite.commons.workloadgeneration.misc.ZooKeeper; import theodolite.commons.workloadgeneration.misc.ZooKeeper;
/** /**
...@@ -41,7 +41,7 @@ public class KafkaWorkloadGenerator<T extends SpecificRecord> ...@@ -41,7 +41,7 @@ public class KafkaWorkloadGenerator<T extends SpecificRecord>
final Duration period, final Duration period,
final Duration duration, final Duration duration,
final BeforeAction beforeAction, final BeforeAction beforeAction,
final MessageGenerator<T> generatorFunction, final RecordGenerator<T> generatorFunction,
final KafkaRecordSender<T> recordSender) { final KafkaRecordSender<T> recordSender) {
super(instances, zooKeeper, keySpace, threads, period, duration, beforeAction, super(instances, zooKeeper, keySpace, threads, period, duration, beforeAction,
generatorFunction, generatorFunction,
......
...@@ -3,10 +3,10 @@ package theodolite.commons.workloadgeneration.generators; ...@@ -3,10 +3,10 @@ package theodolite.commons.workloadgeneration.generators;
import java.time.Duration; import java.time.Duration;
import java.util.Objects; import java.util.Objects;
import org.apache.avro.specific.SpecificRecord; import org.apache.avro.specific.SpecificRecord;
import theodolite.commons.workloadgeneration.KeySpace;
import theodolite.commons.workloadgeneration.communication.kafka.KafkaRecordSender; import theodolite.commons.workloadgeneration.communication.kafka.KafkaRecordSender;
import theodolite.commons.workloadgeneration.dimensions.KeySpace;
import theodolite.commons.workloadgeneration.functions.BeforeAction; import theodolite.commons.workloadgeneration.functions.BeforeAction;
import theodolite.commons.workloadgeneration.functions.MessageGenerator; import theodolite.commons.workloadgeneration.functions.RecordGenerator;
import theodolite.commons.workloadgeneration.misc.ZooKeeper; import theodolite.commons.workloadgeneration.misc.ZooKeeper;
/** /**
...@@ -23,7 +23,7 @@ public final class KafkaWorkloadGeneratorBuilder<T extends SpecificRecord> { // ...@@ -23,7 +23,7 @@ public final class KafkaWorkloadGeneratorBuilder<T extends SpecificRecord> { //
private Duration period; // NOPMD private Duration period; // NOPMD
private Duration duration; // NOPMD private Duration duration; // NOPMD
private BeforeAction beforeAction; // NOPMD private BeforeAction beforeAction; // NOPMD
private MessageGenerator<T> generatorFunction; // NOPMD private RecordGenerator<T> generatorFunction; // NOPMD
private KafkaRecordSender<T> kafkaRecordSender; // NOPMD private KafkaRecordSender<T> kafkaRecordSender; // NOPMD
private KafkaWorkloadGeneratorBuilder() { private KafkaWorkloadGeneratorBuilder() {
...@@ -123,7 +123,7 @@ public final class KafkaWorkloadGeneratorBuilder<T extends SpecificRecord> { // ...@@ -123,7 +123,7 @@ public final class KafkaWorkloadGeneratorBuilder<T extends SpecificRecord> { //
* @return the builder. * @return the builder.
*/ */
public KafkaWorkloadGeneratorBuilder<T> generatorFunction( public KafkaWorkloadGeneratorBuilder<T> generatorFunction(
final MessageGenerator<T> generatorFunction) { final RecordGenerator<T> generatorFunction) {
this.generatorFunction = generatorFunction; this.generatorFunction = generatorFunction;
return this; return this;
} }
......
package theodolite.commons.workloadgeneration.misc; package theodolite.commons.workloadgeneration.misc;
import theodolite.commons.workloadgeneration.dimensions.KeySpace; import theodolite.commons.workloadgeneration.KeySpace;
/** /**
* The central class that contains all information that needs to be exchanged between the nodes for * The central class that contains all information that needs to be exchanged between the nodes for
......
package theodolite.commons.workloadgeneration.misc; package theodolite.commons.workloadgeneration.misc;
import theodolite.commons.workloadgeneration.functions.MessageGenerator; import theodolite.commons.workloadgeneration.functions.RecordGenerator;
/** /**
* Representation of a entity of the workload generation that generates load for one fixed key. * Representation of a entity of the workload generation that generates load for one fixed key.
...@@ -9,14 +9,14 @@ import theodolite.commons.workloadgeneration.functions.MessageGenerator; ...@@ -9,14 +9,14 @@ import theodolite.commons.workloadgeneration.functions.MessageGenerator;
*/ */
public class WorkloadEntity<T> { public class WorkloadEntity<T> {
private final String key; private final String key;
private final MessageGenerator<T> generator; private final RecordGenerator<T> generator;
public WorkloadEntity(final String key, final MessageGenerator<T> generator) { public WorkloadEntity(final String key, final RecordGenerator<T> generator) {
this.key = key; this.key = key;
this.generator = generator; this.generator = generator;
} }
public T generateMessage() { public T generateMessage() {
return this.generator.generateMessage(this.key); return this.generator.generate(this.key);
} }
} }
package theodolite.commons.workloadgeneration.dimensions;
import org.junit.Assert;
import org.junit.Test;
import theodolite.commons.workloadgeneration.KeySpace;
public class KeySpaceTest {
@Test
public void testCountFixedRangeFromZero() {
final KeySpace keySpace = new KeySpace("prefix", 0, 9);
final int count = keySpace.getCount();
Assert.assertEquals(10, count);
}
@Test
public void testCountFixedRangeNotFromZero() {
final KeySpace keySpace = new KeySpace("prefix", 4, 11);
final int count = keySpace.getCount();
Assert.assertEquals(8, count);
}
@Test
public void testCountAutoRange() {
final KeySpace keySpace = new KeySpace("prefix", 42);
final int count = keySpace.getCount();
Assert.assertEquals(42, count);
}
}
package theodolite.commons.workloadgeneration.misc;
import java.time.Duration;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import org.junit.Assert;
import org.junit.Test;
import theodolite.commons.workloadgeneration.KeySpace;
import theodolite.commons.workloadgeneration.WorkloadDefinition;
public class WorkloadDefinition2Test {
@Test
public void testDivideByOneAmount() {
final KeySpace keySpace = new KeySpace("prefix", 100);
final WorkloadDefinition workload = new WorkloadDefinition(keySpace, Duration.ofSeconds(1));
final Set<WorkloadDefinition> subworkloads = workload.divide(1);
Assert.assertEquals(1, subworkloads.size());
}
@Test
public void testDivideMultipleAmount() {
final KeySpace keySpace = new KeySpace("prefix", 100);
final WorkloadDefinition workload = new WorkloadDefinition(keySpace, Duration.ofSeconds(1));
final Set<WorkloadDefinition> subworkloads = workload.divide(2);
Assert.assertEquals(2, subworkloads.size());
}
@Test
public void testDivideNonMultipleAmount() {
final KeySpace keySpace = new KeySpace("prefix", 100);
final WorkloadDefinition workload = new WorkloadDefinition(keySpace, Duration.ofSeconds(1));
final Set<WorkloadDefinition> subworkloads = workload.divide(3);
Assert.assertEquals(3, subworkloads.size());
}
@Test
public void testDivide() {
final KeySpace keySpace = new KeySpace("prefix", 100);
final WorkloadDefinition workload = new WorkloadDefinition(keySpace, Duration.ofSeconds(1));
final Set<WorkloadDefinition> subworkloads = workload.divide(3);
Assert.assertEquals(3, subworkloads.size());
for (final WorkloadDefinition subworkload : subworkloads) {
Assert.assertEquals("prefix", subworkload.getKeySpace().getPrefix());
Assert.assertEquals(Duration.ofSeconds(1), subworkload.getPeriod());
}
final List<WorkloadDefinition> orderedSubworkloads = subworkloads.stream()
.sorted(Comparator.comparingInt(l -> l.getKeySpace().getMin()))
.collect(Collectors.toList());
final WorkloadDefinition subworkload1 = orderedSubworkloads.get(0);
Assert.assertEquals(0, subworkload1.getKeySpace().getMin());
Assert.assertEquals(33, subworkload1.getKeySpace().getMax());
final WorkloadDefinition subworkload2 = orderedSubworkloads.get(1);
Assert.assertEquals(34, subworkload2.getKeySpace().getMin());
Assert.assertEquals(67, subworkload2.getKeySpace().getMax());
final WorkloadDefinition subworkload3 = orderedSubworkloads.get(2);
Assert.assertEquals(68, subworkload3.getKeySpace().getMin());
Assert.assertEquals(99, subworkload3.getKeySpace().getMax());
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment