diff --git a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/core/Stoppable.java b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/core/Stoppable.java index d7967cfa4..642fe6b7d 100644 --- a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/core/Stoppable.java +++ b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/core/Stoppable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 nosqlbench + * Copyright (c) 2022-2023 nosqlbench * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,4 +22,12 @@ public interface Stoppable { * completes, the request will cause the component to stop cooperatively. */ void requestStop(); + + static void stop(Object... candidates) { + for (Object candidate : candidates) { + if (candidate instanceof Stoppable stoppable) { + stoppable.requestStop(); + } + } + } } diff --git a/engine-api/src/main/java/io/nosqlbench/engine/api/activityimpl/motor/CoreMotor.java b/engine-api/src/main/java/io/nosqlbench/engine/api/activityimpl/motor/CoreMotor.java index 7ea58a5ea..eeef96711 100644 --- a/engine-api/src/main/java/io/nosqlbench/engine/api/activityimpl/motor/CoreMotor.java +++ b/engine-api/src/main/java/io/nosqlbench/engine/api/activityimpl/motor/CoreMotor.java @@ -463,12 +463,7 @@ public class CoreMotor implements ActivityDefObserver, Motor, Stoppable { public synchronized void requestStop() { RunState currentState = motorState.get(); if (Objects.requireNonNull(currentState) == Running) { - if (input instanceof Stoppable) { - ((Stoppable) input).requestStop(); - } - if (action instanceof Stoppable) { - ((Stoppable) action).requestStop(); - } + Stoppable.stop(input, action); motorState.enterState(Stopping); } else { logger.warn(() -> "attempted to stop motor " + this.getSlotId() + ": from non Running state:" + currentState); diff --git a/engine-api/src/main/java/io/nosqlbench/engine/api/activityimpl/motor/RunStateImage.java b/engine-api/src/main/java/io/nosqlbench/engine/api/activityimpl/motor/RunStateImage.java index bdca85180..6ea534910 100644 --- a/engine-api/src/main/java/io/nosqlbench/engine/api/activityimpl/motor/RunStateImage.java +++ b/engine-api/src/main/java/io/nosqlbench/engine/api/activityimpl/motor/RunStateImage.java @@ -20,6 +20,8 @@ import io.nosqlbench.engine.api.activityapi.core.RunState; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import java.util.Arrays; + /** * A value type which encodes the atomic state of a RunState tally. */ @@ -39,21 +41,43 @@ public class RunStateImage { } public boolean is(RunState runState) { - return counts[runState.ordinal()]>0; + return counts[runState.ordinal()] > 0; } public boolean isOnly(RunState runState) { for (int i = 0; i < counts.length; i++) { - if (counts[i]>0 && i!=runState.ordinal()) { + if (counts[i] > 0 && i != runState.ordinal()) { return false; } } return true; } + public boolean isNonOther(RunState... runStates) { + int[] scan = Arrays.copyOf(counts, counts.length); + for (RunState runState : runStates) { + scan[runState.ordinal()]=0; + } + for (int i : scan) { + if (i>0) { + return false; + } + } + return true; + } + + public RunState getMinState() { + for (int ord = 0; ord < counts.length - 1; ord++) { + if (counts[ord] > 0) { + return RunState.values()[ord]; + } + } + throw new RuntimeException("There were zero states, so min state is undefined"); + } + public RunState getMaxState() { - for (int ord = counts.length-1; ord >= 0; ord--) { - if (counts[ord]>0) { + for (int ord = counts.length - 1; ord >= 0; ord--) { + if (counts[ord] > 0) { return RunState.values()[ord]; } }