diff --git a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/core/Activity.java b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/core/Activity.java index 99f11e39a..853861d04 100644 --- a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/core/Activity.java +++ b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/core/Activity.java @@ -17,18 +17,18 @@ package io.nosqlbench.engine.api.activityapi.core; import com.codahale.metrics.Timer; +import io.nosqlbench.api.config.NBComponent; +import io.nosqlbench.api.engine.activityimpl.ActivityDef; +import io.nosqlbench.api.engine.activityimpl.ParameterMap; import io.nosqlbench.engine.api.activityapi.core.progress.ProgressCapable; import io.nosqlbench.engine.api.activityapi.core.progress.StateCapable; import io.nosqlbench.engine.api.activityapi.cyclelog.filters.IntPredicateDispenser; import io.nosqlbench.engine.api.activityapi.errorhandling.ErrorMetrics; +import io.nosqlbench.engine.api.activityapi.input.InputDispenser; import io.nosqlbench.engine.api.activityapi.output.OutputDispenser; +import io.nosqlbench.engine.api.activityapi.ratelimits.RateLimiter; import io.nosqlbench.engine.api.activityimpl.SimpleActivity; import io.nosqlbench.engine.api.activityimpl.motor.RunStateTally; -import io.nosqlbench.api.labels.NBLabeledElement; -import io.nosqlbench.api.engine.activityimpl.ActivityDef; -import io.nosqlbench.api.engine.activityimpl.ParameterMap; -import io.nosqlbench.engine.api.activityapi.input.InputDispenser; -import io.nosqlbench.engine.api.activityapi.ratelimits.RateLimiter; import java.io.InputStream; import java.io.PrintWriter; @@ -38,7 +38,7 @@ import java.util.function.Supplier; * Provides the components needed to build and run an activity a runtime. * The easiest way to build a useful Activity is to extend {@link SimpleActivity}. */ -public interface Activity extends Comparable, ActivityDefObserver, ProgressCapable, StateCapable, NBLabeledElement { +public interface Activity extends Comparable, ActivityDefObserver, ProgressCapable, StateCapable, NBComponent { /** * Provide the activity with the controls needed to stop itself. diff --git a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/core/ActivityType.java b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/core/ActivityType.java index 6f894b162..0959cc4c2 100644 --- a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/core/ActivityType.java +++ b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/core/ActivityType.java @@ -16,14 +16,14 @@ package io.nosqlbench.engine.api.activityapi.core; +import io.nosqlbench.api.config.NBComponent; +import io.nosqlbench.api.engine.activityimpl.ActivityDef; +import io.nosqlbench.engine.api.activityapi.input.InputDispenser; import io.nosqlbench.engine.api.activityapi.output.OutputDispenser; import io.nosqlbench.engine.api.activityimpl.CoreServices; import io.nosqlbench.engine.api.activityimpl.SimpleActivity; import io.nosqlbench.engine.api.activityimpl.action.CoreActionDispenser; import io.nosqlbench.engine.api.activityimpl.motor.CoreMotorDispenser; -import io.nosqlbench.api.labels.NBLabeledElement; -import io.nosqlbench.engine.api.activityapi.input.InputDispenser; -import io.nosqlbench.api.engine.activityimpl.ActivityDef; import java.util.Map; import java.util.Optional; @@ -36,7 +36,7 @@ import java.util.Optional; * an action dispenser. Default implementations of input and motor dispensers are provided, * and by extension, default inputs and motors.

*/ -@Deprecated(forRemoval = true,since = "5.0") +//@Deprecated(forRemoval = true,since = "5.0") public interface ActivityType { @@ -47,8 +47,8 @@ public interface ActivityType { * @return a distinct Activity instance for each call */ @SuppressWarnings("unchecked") - default A getActivity(final ActivityDef activityDef, final NBLabeledElement parentLabels) { - final SimpleActivity activity = new SimpleActivity(activityDef, parentLabels); + default A getActivity(final ActivityDef activityDef, final NBComponent parent) { + final SimpleActivity activity = new SimpleActivity(parent,activityDef); return (A) activity; } @@ -60,8 +60,8 @@ public interface ActivityType { * @param activities a map of existing activities * @return a distinct activity instance for each call */ - default Activity getAssembledActivity(final ActivityDef activityDef, final Map activities, final NBLabeledElement labels) { - final A activity = this.getActivity(activityDef, labels); + default Activity getAssembledActivity(final ActivityDef activityDef, final Map activities, final NBComponent parent) { + final A activity = this.getActivity(activityDef, parent); final InputDispenser inputDispenser = this.getInputDispenser(activity); if (inputDispenser instanceof ActivitiesAware) ((ActivitiesAware) inputDispenser).setActivitiesMap(activities); diff --git a/engine-api/src/main/java/io/nosqlbench/engine/api/activityimpl/SimpleActivity.java b/engine-api/src/main/java/io/nosqlbench/engine/api/activityimpl/SimpleActivity.java index 31a04cdff..6a8059eca 100644 --- a/engine-api/src/main/java/io/nosqlbench/engine/api/activityimpl/SimpleActivity.java +++ b/engine-api/src/main/java/io/nosqlbench/engine/api/activityimpl/SimpleActivity.java @@ -17,7 +17,8 @@ package io.nosqlbench.engine.api.activityimpl; import com.codahale.metrics.Timer; -import io.nosqlbench.api.labels.NBLabelSpec; +import io.nosqlbench.api.config.NBComponent; +import io.nosqlbench.api.config.standard.NBBaseComponent; import io.nosqlbench.engine.api.activityapi.core.*; import io.nosqlbench.engine.api.activityapi.core.progress.ActivityMetricProgressMeter; import io.nosqlbench.engine.api.activityapi.core.progress.ProgressMeterDisplay; @@ -29,7 +30,6 @@ import io.nosqlbench.engine.api.activityapi.ratelimits.RateLimiters; import io.nosqlbench.engine.api.activityapi.ratelimits.RateSpec; import io.nosqlbench.adapters.api.activityimpl.OpDispenser; import io.nosqlbench.adapters.api.activityimpl.OpMapper; -import io.nosqlbench.api.labels.NBLabeledElement; import io.nosqlbench.api.labels.NBLabels; import io.nosqlbench.api.config.standard.NBConfiguration; import io.nosqlbench.api.engine.activityimpl.ActivityDef; @@ -67,9 +67,8 @@ import java.util.stream.Collectors; /** * A default implementation of an Activity, suitable for building upon. */ -public class SimpleActivity implements Activity { +public class SimpleActivity extends NBBaseComponent implements Activity { private static final Logger logger = LogManager.getLogger("ACTIVITY"); - private final NBLabeledElement parentLabels; protected ActivityDef activityDef; private final List closeables = new ArrayList<>(); @@ -91,18 +90,10 @@ public class SimpleActivity implements Activity { private ActivityMetricProgressMeter progressMeter; private String workloadSource = "unspecified"; private final RunStateTally tally = new RunStateTally(); - private final NBLabels labels; - public SimpleActivity(ActivityDef activityDef, NBLabeledElement parentLabels) { - NBLabels activityLabels = parentLabels.getLabels() - .and("activity", activityDef.getAlias()); - Optional auxLabelSpec = activityDef.getParams().getOptionalString("labels"); - if (auxLabelSpec.isPresent()) { - activityLabels = activityLabels.and(NBLabelSpec.parseLabels(auxLabelSpec.get())); - } - this.labels = activityLabels; + public SimpleActivity(NBComponent parent, ActivityDef activityDef) { + super(parent,NBLabels.forKV("activity",activityDef.getAlias()).and(activityDef.auxLabels())); this.activityDef = activityDef; - this.parentLabels = parentLabels; if (activityDef.getAlias().equals(ActivityDef.DEFAULT_ALIAS)) { Optional workloadOpt = activityDef.getParams().getOptionalString( "workload", @@ -119,8 +110,8 @@ public class SimpleActivity implements Activity { } } - public SimpleActivity(String activityDefString, NBLabeledElement parentLabels) { - this(ActivityDef.parseActivityDef(activityDefString), parentLabels); + public SimpleActivity(NBComponent parent, String activityDefString) { + this(parent,ActivityDef.parseActivityDef(activityDefString)); } @Override @@ -706,8 +697,4 @@ public class SimpleActivity implements Activity { return tally; } - @Override - public NBLabels getLabels() { - return this.labels; - } } diff --git a/engine-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/StandardActivity.java b/engine-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/StandardActivity.java index 6a3a07dc6..21f750f69 100644 --- a/engine-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/StandardActivity.java +++ b/engine-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/StandardActivity.java @@ -27,14 +27,14 @@ import io.nosqlbench.adapters.api.activityimpl.uniform.decorators.SyntheticOpTem import io.nosqlbench.adapters.api.activityimpl.uniform.flowtypes.Op; import io.nosqlbench.adapters.api.templating.ParsedOp; import io.nosqlbench.api.Shutdownable; -import io.nosqlbench.api.labels.NBLabeledElement; -import io.nosqlbench.api.labels.NBLabels; +import io.nosqlbench.api.config.NBComponent; import io.nosqlbench.api.config.standard.*; import io.nosqlbench.api.engine.activityimpl.ActivityDef; import io.nosqlbench.api.engine.metrics.ActivityMetrics; import io.nosqlbench.api.engine.metrics.instruments.NBFunctionGauge; import io.nosqlbench.api.errors.BasicError; import io.nosqlbench.api.errors.OpConfigError; +import io.nosqlbench.api.labels.NBLabels; import io.nosqlbench.engine.api.activityapi.planning.OpSequence; import io.nosqlbench.engine.api.activityimpl.SimpleActivity; import io.nosqlbench.nb.annotations.ServiceSelector; @@ -64,8 +64,8 @@ public class StandardActivity extends SimpleActivity implements private final Gauge activeOpsGauge; private final Gauge completeOpsGauge; - public StandardActivity(ActivityDef activityDef, NBLabeledElement parentLabels) { - super(activityDef, parentLabels); + public StandardActivity(NBComponent parent, ActivityDef activityDef) { + super(parent,activityDef); OpsDocList workload; Optional yaml_loc = activityDef.getParams().getOptionalString("yaml", "workload"); diff --git a/engine-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/StandardActivityType.java b/engine-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/StandardActivityType.java index f3c2ceccb..6c80e7492 100644 --- a/engine-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/StandardActivityType.java +++ b/engine-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/StandardActivityType.java @@ -16,16 +16,16 @@ package io.nosqlbench.engine.api.activityimpl.uniform; +import io.nosqlbench.adapters.api.activityconfig.OpsLoader; +import io.nosqlbench.adapters.api.activityconfig.yaml.OpsDocList; import io.nosqlbench.adapters.api.activityimpl.uniform.DriverAdapter; -import io.nosqlbench.api.labels.NBLabeledElement; +import io.nosqlbench.api.config.NBComponent; import io.nosqlbench.api.config.standard.NBConfigModel; import io.nosqlbench.api.config.standard.NBConfiguration; import io.nosqlbench.api.config.standard.NBReconfigurable; import io.nosqlbench.api.engine.activityimpl.ActivityDef; import io.nosqlbench.engine.api.activityapi.core.ActionDispenser; import io.nosqlbench.engine.api.activityapi.core.ActivityType; -import io.nosqlbench.adapters.api.activityconfig.OpsLoader; -import io.nosqlbench.adapters.api.activityconfig.yaml.OpsDocList; import io.nosqlbench.engine.api.activityimpl.SimpleActivity; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -40,26 +40,25 @@ public class StandardActivityType> extends Simpl private static final Logger logger = LogManager.getLogger("ACTIVITY"); private final Map adapters = new HashMap<>(); - public StandardActivityType(final DriverAdapter adapter, final ActivityDef activityDef, final NBLabeledElement parentLabels) { - super(activityDef + public StandardActivityType(final DriverAdapter adapter, final ActivityDef activityDef, final NBComponent parent) { + super(parent,activityDef .deprecate("type","driver") - .deprecate("yaml", "workload"), - parentLabels + .deprecate("yaml", "workload") ); adapters.put(adapter.getAdapterName(),adapter); if (adapter instanceof ActivityDefAware) ((ActivityDefAware) adapter).setActivityDef(activityDef); } - public StandardActivityType(final ActivityDef activityDef, final NBLabeledElement parentLabels) { - super(activityDef, parentLabels); + public StandardActivityType(final ActivityDef activityDef, final NBComponent parent) { + super(parent,activityDef); } @Override - public A getActivity(final ActivityDef activityDef, final NBLabeledElement parentLabels) { + public A getActivity(final ActivityDef activityDef, final NBComponent parent) { if (activityDef.getParams().getOptionalString("async").isPresent()) throw new RuntimeException("This driver does not support async mode yet."); - return (A) new StandardActivity(activityDef, parentLabels); + return (A) new StandardActivity(parent, activityDef); } @Override diff --git a/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/activity/ActivityLoader.java b/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/activity/ActivityLoader.java index c679f5df4..706e2eddb 100644 --- a/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/activity/ActivityLoader.java +++ b/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/activity/ActivityLoader.java @@ -16,7 +16,7 @@ package io.nosqlbench.engine.core.lifecycle.activity; -import io.nosqlbench.api.labels.NBLabeledElement; +import io.nosqlbench.api.config.NBComponent; import io.nosqlbench.api.engine.activityimpl.ActivityDef; import io.nosqlbench.engine.api.activityapi.core.Activity; import io.nosqlbench.engine.api.activityimpl.uniform.StandardActivityType; @@ -41,9 +41,9 @@ public class ActivityLoader { this.scenario = scenario; } - public synchronized Activity loadActivity(ActivityDef activityDef, final NBLabeledElement labels) { + public synchronized Activity loadActivity(ActivityDef activityDef, final NBComponent parent) { activityDef= activityDef.deprecate("yaml","workload").deprecate("type","driver"); - final Activity activity = new StandardActivityType(activityDef, labels).getAssembledActivity(activityDef, this.activityMap, labels); + final Activity activity = new StandardActivityType(activityDef, parent).getAssembledActivity(activityDef, this.activityMap, parent); this.activityMap.put(activity.getAlias(),activity); ActivityLoader.logger.debug("Resolved activity for alias '{}'", activityDef.getAlias()); return activity; diff --git a/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/activity/ActivityTypeLoader.java b/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/activity/ActivityTypeLoader.java index d8df12f13..f2571ed3e 100644 --- a/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/activity/ActivityTypeLoader.java +++ b/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/activity/ActivityTypeLoader.java @@ -16,17 +16,17 @@ package io.nosqlbench.engine.core.lifecycle.activity; -import io.nosqlbench.api.labels.NBLabeledElement; -import io.nosqlbench.engine.api.activityapi.core.ActivityType; -import io.nosqlbench.api.engine.activityimpl.ActivityDef; import io.nosqlbench.adapters.api.activityimpl.uniform.DriverAdapter; -import io.nosqlbench.engine.api.activityimpl.uniform.StandardActivityType; -import io.nosqlbench.nb.annotations.Maturity; -import io.nosqlbench.api.system.NBEnvironment; +import io.nosqlbench.api.config.NBComponent; import io.nosqlbench.api.content.Content; import io.nosqlbench.api.content.NBIO; +import io.nosqlbench.api.engine.activityimpl.ActivityDef; import io.nosqlbench.api.errors.BasicError; import io.nosqlbench.api.spi.SimpleServiceLoader; +import io.nosqlbench.api.system.NBEnvironment; +import io.nosqlbench.engine.api.activityapi.core.ActivityType; +import io.nosqlbench.engine.api.activityimpl.uniform.StandardActivityType; +import io.nosqlbench.nb.annotations.Maturity; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -118,7 +118,7 @@ public class ActivityTypeLoader { return urlsToAdd; } - public Optional load(final ActivityDef activityDef, final NBLabeledElement labels) { + public Optional load(final ActivityDef activityDef, final NBComponent parent) { String driverName = activityDef.getParams() .getOptionalString("driver", "type") @@ -135,18 +135,18 @@ public class ActivityTypeLoader { }) .ifPresent(this::extendClassLoader); - return getDriverAdapter(driverName,activityDef,labels) + return getDriverAdapter(driverName,activityDef,parent) .or(() -> this.ACTIVITYTYPE_SPI_FINDER.getOptionally(driverName)); } - private Optional getDriverAdapter(final String activityTypeName, final ActivityDef activityDef, final NBLabeledElement labels) { + private Optional getDriverAdapter(final String activityTypeName, final ActivityDef activityDef, final NBComponent parent) { final Optional oda = this.DRIVERADAPTER_SPI_FINDER.getOptionally(activityTypeName); if (oda.isPresent()) { final DriverAdapter driverAdapter = oda.get(); - final ActivityType activityType = new StandardActivityType<>(driverAdapter, activityDef, labels); + final ActivityType activityType = new StandardActivityType<>(driverAdapter, activityDef, parent); return Optional.of(activityType); } return Optional.empty(); diff --git a/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/scenario/ScenarioController.java b/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/scenario/ScenarioController.java index fccc7f7b0..ceeee0576 100644 --- a/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/scenario/ScenarioController.java +++ b/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/scenario/ScenarioController.java @@ -74,7 +74,7 @@ public class ScenarioController implements NBLabeledElement { private synchronized ActivityRuntimeInfo doStartActivity(ActivityDef activityDef) { if (!this.activityInfoMap.containsKey(activityDef.getAlias())) { - Activity activity = this.activityLoader.loadActivity(activityDef, this); + Activity activity = this.activityLoader.loadActivity(activityDef, scenario); ActivityExecutor executor = new ActivityExecutor(activity, this.scenario.getScenarioName()); Future startedActivity = activitiesExecutor.submit(executor); ActivityRuntimeInfo activityRuntimeInfo = new ActivityRuntimeInfo(activity, startedActivity, executor); diff --git a/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/scenario/script/MetricsMapper.java b/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/scenario/script/MetricsMapper.java index 378ca2edf..18f0766a0 100644 --- a/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/scenario/script/MetricsMapper.java +++ b/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/scenario/script/MetricsMapper.java @@ -16,20 +16,20 @@ package io.nosqlbench.engine.core.lifecycle.scenario.script; import com.codahale.metrics.*; -import io.nosqlbench.api.labels.NBLabeledElement; -import io.nosqlbench.engine.api.activityapi.core.Activity; -import io.nosqlbench.engine.api.activityapi.core.ActivityType; +import io.nosqlbench.api.config.standard.TestComponent; import io.nosqlbench.api.engine.activityimpl.ActivityDef; import io.nosqlbench.api.engine.metrics.ActivityMetrics; +import io.nosqlbench.engine.api.activityapi.core.Activity; +import io.nosqlbench.engine.api.activityapi.core.ActivityType; import io.nosqlbench.engine.core.lifecycle.activity.ActivityTypeLoader; import io.nosqlbench.engine.core.lifecycle.scenario.script.bindings.PolyglotMetricRegistryBindings; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.lang.reflect.Method; -import java.util.Map.Entry; -import java.util.Timer; import java.util.*; +import java.util.Timer; +import java.util.Map.Entry; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -68,11 +68,11 @@ public enum MetricsMapper { final ActivityDef activityDef = ActivityDef.parseActivityDef(activitySpec); MetricsMapper.logger.info(() -> "introspecting metric names for " + activitySpec); - final Optional activityType = new ActivityTypeLoader().load(activityDef, NBLabeledElement.EMPTY); + final Optional activityType = new ActivityTypeLoader().load(activityDef, TestComponent.INSTANCE); if (!activityType.isPresent()) throw new RuntimeException("Activity type '" + activityDef.getActivityType() + "' does not exist in this runtime."); - final Activity activity = activityType.get().getAssembledActivity(activityDef, new HashMap<>(), NBLabeledElement.EMPTY); + final Activity activity = activityType.get().getAssembledActivity(activityDef, new HashMap<>(), TestComponent.INSTANCE); final PolyglotMetricRegistryBindings nashornMetricRegistryBindings = new PolyglotMetricRegistryBindings(ActivityMetrics.getMetricRegistry()); activity.initActivity(); activity.getInputDispenserDelegate().getInput(0); diff --git a/engine-core/src/main/java/io/nosqlbench/engine/core/metadata/MarkdownFinder.java b/engine-core/src/main/java/io/nosqlbench/engine/core/metadata/MarkdownFinder.java index 0adda87e4..b2556d136 100644 --- a/engine-core/src/main/java/io/nosqlbench/engine/core/metadata/MarkdownFinder.java +++ b/engine-core/src/main/java/io/nosqlbench/engine/core/metadata/MarkdownFinder.java @@ -16,14 +16,14 @@ package io.nosqlbench.engine.core.metadata; -import io.nosqlbench.api.labels.NBLabeledElement; -import io.nosqlbench.engine.api.activityapi.core.ActivityType; -import io.nosqlbench.api.engine.activityimpl.ActivityDef; -import io.nosqlbench.engine.core.lifecycle.activity.ActivityTypeLoader; -import io.nosqlbench.nb.annotations.Service; +import io.nosqlbench.api.config.standard.TestComponent; import io.nosqlbench.api.content.Content; import io.nosqlbench.api.content.NBIO; +import io.nosqlbench.api.engine.activityimpl.ActivityDef; import io.nosqlbench.api.errors.BasicError; +import io.nosqlbench.engine.api.activityapi.core.ActivityType; +import io.nosqlbench.engine.core.lifecycle.activity.ActivityTypeLoader; +import io.nosqlbench.nb.annotations.Service; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -64,7 +64,7 @@ public class MarkdownFinder { } public String forActivityInstance(final String s) { - final ActivityType activityType = new ActivityTypeLoader().load(ActivityDef.parseActivityDef("driver="+s), NBLabeledElement.EMPTY).orElseThrow( + final ActivityType activityType = new ActivityTypeLoader().load(ActivityDef.parseActivityDef("driver="+s), TestComponent.INSTANCE).orElseThrow( () -> new BasicError("Unable to find driver for '" + s + '\'') ); return this.forResourceMarkdown(activityType.getClass().getAnnotation(Service.class) diff --git a/engine-core/src/test/java/io/nosqlbench/engine/core/ActivityExecutorTest.java b/engine-core/src/test/java/io/nosqlbench/engine/core/ActivityExecutorTest.java index fb62f960c..a405281d1 100644 --- a/engine-core/src/test/java/io/nosqlbench/engine/core/ActivityExecutorTest.java +++ b/engine-core/src/test/java/io/nosqlbench/engine/core/ActivityExecutorTest.java @@ -18,16 +18,16 @@ package io.nosqlbench.engine.core; import io.nosqlbench.api.engine.activityimpl.ActivityDef; import io.nosqlbench.api.labels.NBLabeledElement; -import io.nosqlbench.engine.api.activityapi.core.ActionDispenser; -import io.nosqlbench.engine.api.activityapi.core.Activity; -import io.nosqlbench.engine.api.activityapi.core.MotorDispenser; -import io.nosqlbench.engine.api.activityapi.core.SyncAction; +import io.nosqlbench.engine.api.activityapi.core.*; +import io.nosqlbench.engine.api.activityapi.input.Input; import io.nosqlbench.engine.api.activityapi.input.InputDispenser; import io.nosqlbench.engine.api.activityapi.output.OutputDispenser; import io.nosqlbench.engine.api.activityimpl.CoreServices; import io.nosqlbench.engine.api.activityimpl.SimpleActivity; import io.nosqlbench.engine.api.activityimpl.action.CoreActionDispenser; +import io.nosqlbench.engine.api.activityimpl.input.AtomicInput; import io.nosqlbench.engine.api.activityimpl.input.CoreInputDispenser; +import io.nosqlbench.engine.api.activityimpl.motor.CoreMotor; import io.nosqlbench.engine.api.activityimpl.motor.CoreMotorDispenser; import io.nosqlbench.engine.core.lifecycle.ExecutionResult; import io.nosqlbench.engine.core.lifecycle.activity.ActivityExecutor; @@ -36,9 +36,22 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.junit.jupiter.api.Test; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.ForkJoinTask; +import java.util.concurrent.Future; +import io.nosqlbench.api.config.standard.TestComponent; +import io.nosqlbench.api.labels.NBLabeledElement; +import io.nosqlbench.engine.api.activityapi.core.ActionDispenser; +import io.nosqlbench.engine.api.activityapi.core.Activity; +import io.nosqlbench.engine.api.activityapi.core.MotorDispenser; +import io.nosqlbench.engine.api.activityapi.core.SyncAction; import java.util.Map; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.ForkJoinTask; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; import static org.assertj.core.api.Assertions.fail; @@ -83,49 +96,49 @@ class ActivityExecutorTest { // // } -// @Test -// synchronized void testDelayedStartSanity() { -// -// ActivityDef activityDef = ActivityDef.parseActivityDef("driver=diag;alias=test-delayed-start;cycles=1000;initdelay=2000;"); -// new ActivityTypeLoader().load(activityDef, NBLabeledElement.EMPTY); -// -// Activity activity = new DelayedInitActivity(activityDef); -// final InputDispenser inputDispenser = new CoreInputDispenser(activity); -// final ActionDispenser actionDispenser = new CoreActionDispenser(activity); -// final OutputDispenser outputDispenser = CoreServices.getOutputDispenser(activity).orElse(null); -// -// MotorDispenser motorDispenser = new CoreMotorDispenser(activity, inputDispenser, actionDispenser, outputDispenser); -// activity.setActionDispenserDelegate(actionDispenser); -// activity.setOutputDispenserDelegate(outputDispenser); -// activity.setInputDispenserDelegate(inputDispenser); -// activity.setMotorDispenserDelegate(motorDispenser); -// -// ActivityExecutor activityExecutor = new ActivityExecutor(activity, "test-delayed-start"); -// -// ExecutorService testExecutor = Executors.newCachedThreadPool(); -// Future future = testExecutor.submit(activityExecutor); -// -// -// try { -// activityDef.setThreads(1); -// activityExecutor.startActivity(); -// future.get(); -// testExecutor.shutdownNow(); -// -// } catch (final Exception e) { -// fail("Unexpected exception", e); -// } -// -// assertThat(inputDispenser.getInput(10).getInputSegment(3)).isNull(); -// } + @Test + synchronized void testDelayedStartSanity() { + + ActivityDef activityDef = ActivityDef.parseActivityDef("driver=diag;alias=test-delayed-start;cycles=1000;initdelay=2000;"); + new ActivityTypeLoader().load(activityDef, TestComponent.INSTANCE); + + Activity activity = new DelayedInitActivity(activityDef); + final InputDispenser inputDispenser = new CoreInputDispenser(activity); + final ActionDispenser actionDispenser = new CoreActionDispenser(activity); + final OutputDispenser outputDispenser = CoreServices.getOutputDispenser(activity).orElse(null); + + MotorDispenser motorDispenser = new CoreMotorDispenser(activity, inputDispenser, actionDispenser, outputDispenser); + activity.setActionDispenserDelegate(actionDispenser); + activity.setOutputDispenserDelegate(outputDispenser); + activity.setInputDispenserDelegate(inputDispenser); + activity.setMotorDispenserDelegate(motorDispenser); + + ActivityExecutor activityExecutor = new ActivityExecutor(activity, "test-delayed-start"); + + ExecutorService testExecutor = Executors.newCachedThreadPool(); + Future future = testExecutor.submit(activityExecutor); + + + try { + activityDef.setThreads(1); + activityExecutor.startActivity(); + future.get(); + testExecutor.shutdownNow(); + + } catch (final Exception e) { + fail("Unexpected exception", e); + } + + assertThat(inputDispenser.getInput(10).getInputSegment(3)).isNull(); + } @Test synchronized void testNewActivityExecutor() { final ActivityDef activityDef = ActivityDef.parseActivityDef("driver=diag;alias=test-dynamic-params;cycles=1000;initdelay=5000;"); - new ActivityTypeLoader().load(activityDef,NBLabeledElement.EMPTY); + new ActivityTypeLoader().load(activityDef,TestComponent.INSTANCE); - Activity simpleActivity = new SimpleActivity(activityDef, NBLabeledElement.forMap(Map.of())); + Activity simpleActivity = new SimpleActivity(TestComponent.INSTANCE,activityDef); // this.getActivityMotorFactory(this.motorActionDelay(999), new AtomicInput(simpleActivity,activityDef)); @@ -171,6 +184,18 @@ class ActivityExecutorTest { } } + private MotorDispenser getActivityMotorFactory(final Action lc, Input ls) { + return new MotorDispenser<>() { + @Override + public Motor getMotor(final ActivityDef activityDef, final int slotId) { + final Activity activity = new SimpleActivity(TestComponent.INSTANCE,activityDef); + final Motor cm = new CoreMotor<>(activity, slotId, ls); + cm.setAction(lc); + return cm; + } + }; + } + private SyncAction motorActionDelay(long delay) { return new SyncAction() { @Override @@ -190,7 +215,7 @@ class ActivityExecutorTest { private static final Logger logger = LogManager.getLogger(DelayedInitActivity.class); public DelayedInitActivity(final ActivityDef activityDef) { - super(activityDef, NBLabeledElement.EMPTY); + super(TestComponent.INSTANCE,activityDef); } @Override diff --git a/engine-core/src/test/java/io/nosqlbench/engine/core/CoreMotorTest.java b/engine-core/src/test/java/io/nosqlbench/engine/core/CoreMotorTest.java index 0d9f20fbf..d1ec60166 100644 --- a/engine-core/src/test/java/io/nosqlbench/engine/core/CoreMotorTest.java +++ b/engine-core/src/test/java/io/nosqlbench/engine/core/CoreMotorTest.java @@ -16,7 +16,7 @@ package io.nosqlbench.engine.core; -import io.nosqlbench.api.labels.NBLabeledElement; +import io.nosqlbench.api.config.standard.TestComponent; import io.nosqlbench.api.engine.activityimpl.ActivityDef; import io.nosqlbench.engine.api.activityapi.core.Action; import io.nosqlbench.engine.api.activityapi.core.Activity; @@ -27,7 +27,6 @@ import io.nosqlbench.engine.api.activityimpl.motor.CoreMotor; import io.nosqlbench.engine.core.fortesting.BlockingSegmentInput; import org.junit.jupiter.api.Test; -import java.util.Map; import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicLongArray; import java.util.function.Predicate; @@ -39,9 +38,9 @@ public class CoreMotorTest { @Test public void testBasicActivityMotor() { final Activity activity = new SimpleActivity( - ActivityDef.parseActivityDef("alias=foo"), - NBLabeledElement.forMap(Map.of("testing","coremotor")) - ); + new TestComponent("testing", "coremotor"), + ActivityDef.parseActivityDef("alias=foo") + ); final BlockingSegmentInput lockstepper = new BlockingSegmentInput(); final Motor cm = new CoreMotor(activity, 5L, lockstepper); final AtomicLong observableAction = new AtomicLong(-3L); @@ -51,18 +50,19 @@ public class CoreMotorTest { t.start(); try { Thread.sleep(1000); // allow action time to be waiting in monitor for test fixture - } catch (final InterruptedException ignored) {} + } catch (final InterruptedException ignored) { + } lockstepper.publishSegment(5L); - final boolean result = this.awaitCondition(atomicInteger -> 5L == atomicInteger.get(),observableAction,5000,100); + final boolean result = this.awaitCondition(atomicInteger -> 5L == atomicInteger.get(), observableAction, 5000, 100); assertThat(observableAction.get()).isEqualTo(5L); } @Test public void testIteratorStride() { - SimpleActivity activity = new SimpleActivity("stride=3", NBLabeledElement.EMPTY); + SimpleActivity activity = new SimpleActivity(TestComponent.INSTANCE, "stride=3"); final BlockingSegmentInput lockstepper = new BlockingSegmentInput(); - final Motor cm1 = new CoreMotor(activity,1L, lockstepper); + final Motor cm1 = new CoreMotor(activity, 1L, lockstepper); final AtomicLongArray ary = new AtomicLongArray(10); final Action a1 = this.getTestArrayConsumer(ary); cm1.setAction(a1); @@ -72,11 +72,12 @@ public class CoreMotorTest { t1.start(); try { Thread.sleep(500); // allow action time to be waiting in monitor for test fixture - } catch (final InterruptedException ignored) {} + } catch (final InterruptedException ignored) { + } - lockstepper.publishSegment(11L,12L,13L); + lockstepper.publishSegment(11L, 12L, 13L); - final boolean result = this.awaitAryCondition(ala -> 13L == ala.get(2),ary,5000,100); + final boolean result = this.awaitAryCondition(ala -> 13L == ala.get(2), ary, 5000, 100); assertThat(ary.get(0)).isEqualTo(11L); assertThat(ary.get(1)).isEqualTo(12L); assertThat(ary.get(2)).isEqualTo(13L); @@ -87,6 +88,7 @@ public class CoreMotorTest { private SyncAction getTestArrayConsumer(AtomicLongArray ary) { return new SyncAction() { private int offset; + @Override public int runCycle(final long cycle) { ary.set(this.offset, cycle); @@ -95,6 +97,7 @@ public class CoreMotorTest { } }; } + private SyncAction getTestConsumer(AtomicLong atomicLong) { return new SyncAction() { @Override @@ -108,7 +111,7 @@ public class CoreMotorTest { private boolean awaitAryCondition(final Predicate atomicLongAryPredicate, final AtomicLongArray ary, final long millis, final long retry) { final long start = System.currentTimeMillis(); - long now=start; + long now = start; while (now < (start + millis)) { final boolean result = atomicLongAryPredicate.test(ary); if (result) return true; @@ -123,7 +126,7 @@ public class CoreMotorTest { private boolean awaitCondition(final Predicate atomicPredicate, final AtomicLong atomicInteger, final long millis, final long retry) { final long start = System.currentTimeMillis(); - long now=start; + long now = start; while (now < (start + millis)) { final boolean result = atomicPredicate.test(atomicInteger); if (result) return true; diff --git a/nb-api/src/main/java/io/nosqlbench/api/config/standard/TestComponent.java b/nb-api/src/main/java/io/nosqlbench/api/config/standard/TestComponent.java index 7d8076052..7cdd570fb 100644 --- a/nb-api/src/main/java/io/nosqlbench/api/config/standard/TestComponent.java +++ b/nb-api/src/main/java/io/nosqlbench/api/config/standard/TestComponent.java @@ -21,6 +21,7 @@ import io.nosqlbench.api.labels.NBLabels; public class TestComponent implements NBComponent { + public static final NBComponent INSTANCE = new TestComponent(); private final NBLabels labels; public TestComponent(String... labels) { diff --git a/nb-api/src/main/java/io/nosqlbench/api/engine/activityimpl/ActivityDef.java b/nb-api/src/main/java/io/nosqlbench/api/engine/activityimpl/ActivityDef.java index 4b38fbe2c..4996668b5 100644 --- a/nb-api/src/main/java/io/nosqlbench/api/engine/activityimpl/ActivityDef.java +++ b/nb-api/src/main/java/io/nosqlbench/api/engine/activityimpl/ActivityDef.java @@ -18,6 +18,8 @@ package io.nosqlbench.api.engine.activityimpl; import io.nosqlbench.api.config.NBNamedElement; import io.nosqlbench.api.errors.BasicError; +import io.nosqlbench.api.labels.NBLabelSpec; +import io.nosqlbench.api.labels.NBLabels; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -220,4 +222,12 @@ public class ActivityDef implements NBNamedElement { return this; } + public NBLabels auxLabels() { + Optional auxLabelSpec = getParams().getOptionalString("labels"); + if (auxLabelSpec.isPresent()) { + return NBLabelSpec.parseLabels(auxLabelSpec.get()); + } + return NBLabels.forKV(); + + } }