diff --git a/nbr/src/main/java/io/nosqlbench/scenarios/simframe/capture/SimFrameCapture.java b/nbr/src/main/java/io/nosqlbench/scenarios/simframe/capture/SimFrameCapture.java index b1ad14b86..93d66f21d 100644 --- a/nbr/src/main/java/io/nosqlbench/scenarios/simframe/capture/SimFrameCapture.java +++ b/nbr/src/main/java/io/nosqlbench/scenarios/simframe/capture/SimFrameCapture.java @@ -20,6 +20,7 @@ import io.nosqlbench.scenarios.simframe.stabilization.StabilityDetector; import java.util.ArrayList; import java.util.Collections; +import java.util.LinkedList; import java.util.List; import java.util.function.*; @@ -39,7 +40,7 @@ public class SimFrameCapture implements SimFrameResults { private final StabilityDetector stabilizer; public SimFrameCapture() { - stabilizer = new StabilityDetector(0.1,0.98,this::getPartialValue, 10,5); + stabilizer = new StabilityDetector(0.1,0.98,this::getPartialValue, this::toString, 10,5); } private double getPartialValue() { @@ -138,10 +139,11 @@ public class SimFrameCapture implements SimFrameResults { @Override public double getValue() { - if (allFrames.isEmpty()) { - return Double.NaN; + FrameSampleSet lastFrame = allFrames.peekLast(); + if (lastFrame==null) { + System.out.println("no last frame"); } - return allFrames.getLast().value(); + return lastFrame != null ? lastFrame.value() : Double.NaN; } @Override @@ -152,7 +154,8 @@ public class SimFrameCapture implements SimFrameResults { @Override public String toString() { StringBuilder sb = new StringBuilder("PERF VALUE=").append(getValue()).append("\n"); - sb.append("windows:\n").append(allFrames.getLast().toString()); + FrameSampleSet lastFrame = allFrames.peekLast(); + sb.append("windows:\n").append(lastFrame==null ? "NONE" : lastFrame.toString()); return sb.toString(); } @@ -175,6 +178,7 @@ public class SimFrameCapture implements SimFrameResults { throw new RuntimeException("cant start window twice in a row. Must close window first"); } restartWindow(now); +// System.out.println("after (re)start):\n"+ frameCaptureSummary(activeFrame)); } private String frameCaptureSummary(FrameSampleSet currentFrame) { @@ -195,7 +199,7 @@ public class SimFrameCapture implements SimFrameResults { activeFrame.set(i, activeFrame.get(i).stop(now)); } allFrames.add(activeFrame); -// System.out.println("after stop:\n"+ frameCaptureSummary(currentFrame)); +// System.out.println("after stop:\n"+ frameCaptureSummary(activeFrame)); activeFrame = null; } @@ -212,7 +216,7 @@ public class SimFrameCapture implements SimFrameResults { } - public static class FrameSamples extends ArrayList { + public static class FrameSamples extends LinkedList { } } diff --git a/nbr/src/main/java/io/nosqlbench/scenarios/simframe/findmax/planners/ratchet/FindmaxRatchet.java b/nbr/src/main/java/io/nosqlbench/scenarios/simframe/findmax/planners/ratchet/FindmaxRatchet.java index 7ebc309a6..e4f4a8b31 100644 --- a/nbr/src/main/java/io/nosqlbench/scenarios/simframe/findmax/planners/ratchet/FindmaxRatchet.java +++ b/nbr/src/main/java/io/nosqlbench/scenarios/simframe/findmax/planners/ratchet/FindmaxRatchet.java @@ -69,7 +69,7 @@ public class FindmaxRatchet extends SimFramePlanner { applyParams(frameParams,flywheel); capture.startWindow(); capture.awaitSteadyState(); - applyParams(frameParams,flywheel); - capture.restartWindow(); -// controller.waitMillis(500); - capture.awaitSteadyState(); +// applyParams(frameParams,flywheel); +// capture.restartWindow(); +//// controller.waitMillis(500); +// capture.awaitSteadyState(); capture.stopWindow(); journal.record(frameParams, capture.last()); stdout.println(capture.last()); diff --git a/nbr/src/main/java/io/nosqlbench/scenarios/simframe/stabilization/StabilityDetector.java b/nbr/src/main/java/io/nosqlbench/scenarios/simframe/stabilization/StabilityDetector.java index b7d046c85..356469861 100644 --- a/nbr/src/main/java/io/nosqlbench/scenarios/simframe/stabilization/StabilityDetector.java +++ b/nbr/src/main/java/io/nosqlbench/scenarios/simframe/stabilization/StabilityDetector.java @@ -23,12 +23,14 @@ import java.util.Arrays; import java.util.List; import java.util.OptionalDouble; import java.util.function.DoubleSupplier; +import java.util.function.Supplier; public class StabilityDetector implements Runnable { private final static Logger logger = LogManager.getLogger(StabilityDetector.class); private final double timeSliceSeconds; private final double threshold; private final DoubleSupplier source; + private final Supplier summary; private StatBucket[] buckets; private int[] windows; private volatile boolean running = true; @@ -53,13 +55,20 @@ public class StabilityDetector implements Runnable { * The size of each window in the set of diminishing sizes. These contain the last N samples by size, * respectively. */ - public StabilityDetector(double timeSliceSeconds, double minThreshold, DoubleSupplier source, int... windows) { + public StabilityDetector( + double timeSliceSeconds, + double minThreshold, + DoubleSupplier source, + Supplier summary, + int... windows + ) { if (windows.length < 2) { throw new RuntimeException("you must provide at least to summarization windows, ordered in decreasing size."); } this.timeSliceSeconds = timeSliceSeconds; this.threshold = minThreshold; this.source = source; + this.summary = summary; this.windows = windows; for (int i = 0; i < windows.length - 1; i++) { if (windows[i] < windows[i + 1]) { @@ -122,6 +131,8 @@ public class StabilityDetector implements Runnable { for (int i = 0; i < stddev.length; i++) { System.out.printf("[%d]: %g ", windows[i], stddev[i]); } + System.out.println("stddevs: "+ Arrays.toString(stddev)); + System.out.printf(this.summary.get()); System.out.println(); } return basis; @@ -133,6 +144,18 @@ public class StabilityDetector implements Runnable { */ @Override public void run() { + try { +// System.out.println("Detector> OPEN"); + updateAndAwait(); + } catch (Exception e) { +// System.out.println("Detector> ERROR ERROR:" + e.toString()); + throw new RuntimeException(e); + } finally { +// System.out.println("Detector> CLOSE"); + } + } + + private void updateAndAwait() { int interval = (int) (this.timeSliceSeconds * 1000); startedAt = System.currentTimeMillis(); reset(); @@ -145,10 +168,10 @@ public class StabilityDetector implements Runnable { try { Thread.sleep(delay); } catch (InterruptedException ignored) { + System.out.println("Interrupted>"); } delay = nextCheckAt - System.currentTimeMillis(); } - double value = source.getAsDouble(); apply(value); double stabilityFactor = computeStability(); @@ -164,7 +187,7 @@ public class StabilityDetector implements Runnable { } } - private static String levels8 = " ▁▂▃▄▅▆▇"; + private static final String levels8 = " ▁▂▃▄▅▆▇"; public String stabilitySummary(double[] stddev) { StringBuilder sb = new StringBuilder("["); double bias=(1.0d/16.0); diff --git a/nbr/src/main/java/io/nosqlbench/scenarios/simframe/stabilization/StatBucket.java b/nbr/src/main/java/io/nosqlbench/scenarios/simframe/stabilization/StatBucket.java index 05e3fd92d..980138ca8 100644 --- a/nbr/src/main/java/io/nosqlbench/scenarios/simframe/stabilization/StatBucket.java +++ b/nbr/src/main/java/io/nosqlbench/scenarios/simframe/stabilization/StatBucket.java @@ -35,6 +35,7 @@ public final class StatBucket { } public StatBucket apply(double value) { +// System.out.println("stat->" + value + " bucket:" + toString()); double popped = ringbuf.push(value); if (ringbuf.count() == 1) { mean = value;