mirror of
https://github.com/nosqlbench/nosqlbench.git
synced 2025-02-25 18:55:28 -06:00
rework
This commit is contained in:
@@ -33,70 +33,69 @@ import org.apache.logging.log4j.Logger;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
import java.io.Reader;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
@Service(value = NBBaseCommand.class,selector = "reset")
|
||||
public class CMD_reset extends NBBaseCommand {
|
||||
public final static Logger logger = LogManager.getLogger("reset");
|
||||
public static final String DEFAULT_RATE = "100";
|
||||
public static final String DEFAULT_THREADS = "10";
|
||||
private static final HashSet<String> IGNORABLE = new HashSet<>(List.of("activity"));
|
||||
|
||||
public CMD_reset(NBBufferedContainer parentComponent, String scenarioName, String context) {
|
||||
super(parentComponent, scenarioName, context);
|
||||
}
|
||||
|
||||
/**
|
||||
* This command is used to restart the initial step activity in a scenario after optimization results have
|
||||
* been determined by the previous steps. Any parameters that should be modified from the initially specified
|
||||
* parameters for the activity should be specified on the command line, typically using bindings to reference
|
||||
* the outputs of the previous steps, although this is not mandatory.
|
||||
* @param params
|
||||
* @param stdout
|
||||
* @param stderr
|
||||
* @param stdin
|
||||
* @param controller
|
||||
* @return null
|
||||
*/
|
||||
@Override
|
||||
public Object invoke(NBCommandParams params, PrintWriter stdout, PrintWriter stderr, Reader stdin, ContainerActivitiesController controller) {
|
||||
Optional<Activity> optionalActivity = Optional.ofNullable(params.get("activity")).flatMap(controller::getActivity);
|
||||
if (params.get("activity")!=null && optionalActivity.isEmpty()) {
|
||||
throw new RuntimeException("you specified activity '" + params.get("activity") + "' but it was not found.");
|
||||
}
|
||||
Activity flywheel = optionalActivity.or(controller::getSoloActivity)
|
||||
.orElseThrow(() -> new RuntimeException("You didn't provide the name of an activity to attach to, nor was there a solo activity available in this context"));
|
||||
try (Activity flywheel = optionalActivity.or(controller::getSoloActivity)
|
||||
.orElseThrow(() -> new RuntimeException("You didn't provide the name of an activity to attach to, nor was there a solo activity available in this context"))) {
|
||||
|
||||
/*
|
||||
Set the CycleRateSpec. This should be found in params.get("rate") if the value from a previous step is specified.
|
||||
If no value from a previous step is used, the original can be found in the flywheel activity definition.
|
||||
If a value is passed in on the command line as opposed to specified in the yaml file it will override other values, so don't do this.
|
||||
params.forEach((key, value) -> {
|
||||
switch (key) {
|
||||
case "rate" -> {
|
||||
logger.debug("Resetting rate to " + value + " cycles per second");
|
||||
flywheel.onEvent(new ParamChange<>(new CycleRateSpec(Double.parseDouble(value), 1.1d, SimRateSpec.Verb.restart)));
|
||||
}
|
||||
case "threads" -> {
|
||||
logger.debug("Resetting threads to " + value + " threads");
|
||||
flywheel.onEvent(ParamChange.of(new SetThreads((int) Math.round(Double.parseDouble(value)))));
|
||||
}
|
||||
default -> {
|
||||
if (!IGNORABLE.contains(key)) {
|
||||
logger.debug("Resetting parameter: " + key + " to " + value);
|
||||
flywheel.getActivityDef().getParams().put(key, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
cli rate| yaml rate| reset rate| params rate| flywheel params rate
|
||||
null | 1 | 50 | 50 | 1
|
||||
null | null | 50 | 50 | null
|
||||
null | 1 | null | null | 1
|
||||
1 | 5 | 50 | 1 | 1
|
||||
1 | null | 50 | 1 | 1
|
||||
*/
|
||||
String rateStr = params.hasMember("rate") ? params.get("rate") :
|
||||
flywheel.getActivityDef().getParams().getOptionalString("rate").orElse(DEFAULT_RATE);
|
||||
logger.debug("Resetting rate to " + rateStr + " cycles per second");
|
||||
flywheel.onEvent(new ParamChange<>(new CycleRateSpec(Double.parseDouble(rateStr), 1.1d, SimRateSpec.Verb.restart)));
|
||||
// Get the original cycle count and re-apply it
|
||||
long cycles = Long.parseLong((String) flywheel.getActivityDef().getParams().get("cycles"));
|
||||
logger.debug("Resetting cycle count to " + cycles + " cycles");
|
||||
flywheel.getActivityDef().setEndCycle(cycles);
|
||||
|
||||
// Get the original cycle count and re-apply it
|
||||
long cycles = Long.parseLong((String) flywheel.getActivityDef().getParams().get("cycles"));
|
||||
logger.debug("Resetting cycle count to " + cycles + " cycles");
|
||||
flywheel.getActivityDef().setEndCycle(cycles);
|
||||
|
||||
/*
|
||||
Set the thread count. This should be found in params and the flywheel if the value from a previous step is specified.
|
||||
If no value from a previous step is used, the original can be found in the flywheel activity definition.
|
||||
If a value is passed in on the command line as opposed to specified in the yaml file it will be found in params
|
||||
and the correct optimo thread count can be found in the flywheel, so in this case we go to the flywheel first
|
||||
|
||||
cli threads| yaml threads| reset threads| params threads| flywheel params threads
|
||||
null | 1 | 50 | 50 | 50
|
||||
null | null | 50 | 50 | 50
|
||||
null | 1 | null | null | 1
|
||||
1 | 5 | 50 | 1 | 50
|
||||
1 | null | 50 | 1 | 50
|
||||
*/
|
||||
|
||||
String threadStr = flywheel.getActivityDef().getParams().getOptionalString("threads")
|
||||
.orElse(params.hasMember("threads") ? params.get("threads") : DEFAULT_THREADS);
|
||||
logger.debug("Resetting threads to " + threadStr);
|
||||
flywheel.onEvent(ParamChange.of(new SetThreads((int)Math.round(Double.parseDouble(threadStr)))));
|
||||
|
||||
SimFrameUtils.awaitActivity(flywheel);
|
||||
flywheel.getMotorDispenserDelegate().getMotor(flywheel.getActivityDef(), 0).run();
|
||||
//TODO: This needs to be reworked, but simply calling controller.start on the flywheel results in 2
|
||||
// copies of the activity running simultaneously. This is a temporary workaround.
|
||||
SimFrameUtils.awaitActivity(flywheel);
|
||||
flywheel.getMotorDispenserDelegate().getMotor(flywheel.getActivityDef(), 0).run();
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user