diff --git a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/ratelimits/LeastWorstDelay.java b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/ratelimits/LeastWorstDelay.java index b54999e88..78f568525 100644 --- a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/ratelimits/LeastWorstDelay.java +++ b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/ratelimits/LeastWorstDelay.java @@ -25,8 +25,14 @@ import java.util.concurrent.locks.LockSupport; public class LeastWorstDelay { public final static SysPerfData perfdata = SysPerf.get().getPerfData(false); - private final static long sleepThreshold = (long) perfdata.getAvgNanos_Thread_Sleep(); - private final static long parkThreshold = (long) perfdata.getAvgNanos_LockSupport_ParkNanos(); + + //private final static long sleepThreshold = (long) perfdata + //.getAvgNanos_Thread_Sleep(); + //private final static long parkThreshold = (long) perfdata + //.getAvgNanos_LockSupport_ParkNanos(); + + private final static long sleepThreshold = 1_000_000; + private final static long parkThreshold = 20; /** * We wish for the JVM to inline this. @@ -46,13 +52,13 @@ public class LeastWorstDelay { public static void delayAsIfFor(long nanos) { if (nanos > 0) { if (nanos > sleepThreshold) { - nanos-=sleepThreshold; + nanos -= sleepThreshold; try { Thread.sleep((nanos / 1000000), (int) (nanos % 1000000)); } catch (InterruptedException ignored) { } } else if (nanos > parkThreshold) { - nanos-=parkThreshold; + nanos -= parkThreshold; LockSupport.parkNanos(nanos); } } @@ -86,20 +92,19 @@ public class LeastWorstDelay { * this method in other scenarios. * * @param targetNanoTime The system nanos that the delay should attempt to return at. - * perfect accuracy, which doesn't happen - * + * perfect accuracy, which doesn't happen */ public void delayAsIfUntil(long targetNanoTime) { - long nanos = Math.max(targetNanoTime - System.nanoTime(),0L); + long nanos = Math.max(targetNanoTime - System.nanoTime(), 0L); if (nanos > 0) { if (nanos > sleepThreshold) { - nanos-=sleepThreshold; + nanos -= sleepThreshold; try { Thread.sleep((nanos / 1000000), (int) (nanos % 1000000)); } catch (InterruptedException ignored) { } } else if (nanos > parkThreshold) { - nanos-=parkThreshold; + nanos -= parkThreshold; LockSupport.parkNanos(nanos); } // else there is nothing shorter than this besides spinning, and we're not doing that } diff --git a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/ratelimits/TokenFiller.java b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/ratelimits/TokenFiller.java index 427160ca3..bc1933ed8 100644 --- a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/ratelimits/TokenFiller.java +++ b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/ratelimits/TokenFiller.java @@ -18,8 +18,6 @@ package io.nosqlbench.engine.api.activityapi.ratelimits; import com.codahale.metrics.Timer; -import io.nosqlbench.engine.api.activityapi.sysperf.SysPerf; -import io.nosqlbench.engine.api.activityapi.sysperf.SysPerfData; import io.nosqlbench.engine.api.activityimpl.ActivityDef; import io.nosqlbench.engine.api.metrics.ActivityMetrics; import org.slf4j.Logger; @@ -33,7 +31,8 @@ public class TokenFiller implements Runnable { public final static double MIN_PER_SECOND = 10D; public final static double MAX_PER_SECOND = 1000D; - private final SysPerfData PERFDATA = SysPerf.get().getPerfData(false); +// private final SysPerfData PERFDATA = SysPerf.get().getPerfData +// (false); private final long interval = (long) 1E6; private final TokenPool tokenPool; diff --git a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/sysperf/SysPerf.java b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/sysperf/SysPerf.java index 8d5842151..22b0237ca 100644 --- a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/sysperf/SysPerf.java +++ b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/sysperf/SysPerf.java @@ -41,10 +41,12 @@ public class SysPerf { } public synchronized static SysPerf get() { - if (instance == null) { - instance = new SysPerf(); - } - return instance; + throw new RuntimeException("This should not be used in this " + + "release."); +// if (instance == null) { +// instance = new SysPerf(); +// } +// return instance; } private static File getPerfCacheFile() { diff --git a/nb/src/test/java/io/nosqlbench/engine/core/script/ScriptIntegrationTests.java b/nb/src/test/java/io/nosqlbench/engine/core/script/ScriptIntegrationTests.java index 15ba7f6b4..be70a3216 100644 --- a/nb/src/test/java/io/nosqlbench/engine/core/script/ScriptIntegrationTests.java +++ b/nb/src/test/java/io/nosqlbench/engine/core/script/ScriptIntegrationTests.java @@ -24,15 +24,10 @@ import org.assertj.core.data.Offset; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Paths; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; -import java.util.stream.Collectors; import static org.assertj.core.api.Assertions.assertThat; @@ -85,180 +80,185 @@ public class ScriptIntegrationTests { assertThat(rate).isCloseTo(1000, Offset.offset(100.0)); } - @Test - public void testStrideRateOnly() { - ScenarioResult scenarioResult = runScenario("stride_rate"); - String iolog = scenarioResult.getIOLog(); - System.out.println("iolog\n" + iolog); - Pattern p = Pattern.compile(".*stride_rate.strides.servicetime.meanRate = (\\d[.\\d]+).*", Pattern.DOTALL); - Matcher m = p.matcher(iolog); - assertThat(m.matches()).isTrue(); - - String digits = m.group(1); - assertThat(digits).isNotEmpty(); - double rate = Double.valueOf(digits); - assertThat(rate).isCloseTo(10000.0D, Offset.offset(1000D)); - } - - @Test - public void testPhaseRateOnly() { - ScenarioResult scenarioResult = runScenario("phase_rate"); - String iolog = scenarioResult.getIOLog(); - System.out.println("iolog\n" + iolog); - Pattern p = Pattern.compile(".*phase_rate.phases.servicetime.meanRate = (\\d[.\\d]+).*", Pattern.DOTALL); - Matcher m = p.matcher(iolog); - assertThat(m.matches()).isTrue(); - - String digits = m.group(1); - assertThat(digits).isNotEmpty(); - double rate = Double.valueOf(digits); - assertThat(rate).isCloseTo(25000.0D, Offset.offset(5000D)); - } - - - @Test - public void testExtensionPoint() { - ScenarioResult scenarioResult = runScenario("extensions"); - assertThat(scenarioResult.getIOLog()).contains("sum is 46"); - } - - @Test - public void testLinkedInput() { - ScenarioResult scenarioResult = runScenario("linkedinput"); - Pattern p = Pattern.compile(".*started leader.*started follower.*stopped leader.*stopped follower.*", - Pattern.DOTALL); - assertThat(p.matcher(scenarioResult.getIOLog()).matches()).isTrue(); - } - - @Test - public void testExtensionCsvLogger() { - ScenarioResult scenarioResult = runScenario("extension_csvmetrics"); - assertThat(scenarioResult.getIOLog()).contains("started new " + - "csvlogger: logs/csvmetricstestdir"); - } - - - @Test - public void testScriptParamsVariable() { - ScenarioResult scenarioResult = runScenario("params_variable", "one", "two", "three", "four"); - assertThat(scenarioResult.getIOLog()).contains("params.get(\"one\")='two'"); - assertThat(scenarioResult.getIOLog()).contains("params.get(\"three\")='four'"); - assertThat(scenarioResult.getIOLog()).contains("params.size()=2"); - assertThat(scenarioResult.getIOLog()).contains("params.get(\"three\") [overridden-three-five]='five'"); - assertThat(scenarioResult.getIOLog()).contains("params.get(\"four\") [defaulted-four-niner]='niner'"); - } - - @Test - public void testExtensionHistoStatsLogger() throws IOException { - ScenarioResult scenarioResult = runScenario("extension_histostatslogger"); - assertThat(scenarioResult.getIOLog()).contains("stdout started " + - "logging to logs/histostats.csv"); - List strings = Files.readAllLines(Paths.get( - "logs/histostats.csv")); - String logdata = strings.stream().collect(Collectors.joining("\n")); - assertThat(logdata).contains("min,p25,p50,p75,p90,p95,"); - assertThat(logdata.split("Tag=testhistostatslogger.cycles.servicetime,").length).isGreaterThanOrEqualTo(3); - } - - @Test - public void testExtensionHistogramLogger() throws IOException { - ScenarioResult scenarioResult = runScenario("extension_histologger"); - assertThat(scenarioResult.getIOLog()).contains("stdout started logging to hdrhistodata.log"); - List strings = Files.readAllLines(Paths.get("hdrhistodata.log")); - String logdata = strings.stream().collect(Collectors.joining("\n")); - assertThat(logdata).contains(",HIST"); - assertThat(logdata.split("Tag=testhistologger.cycles.servicetime,").length).isGreaterThanOrEqualTo(3); - } - - @Test - public void testBlockingRun() { - ScenarioResult scenarioResult = runScenario("blockingrun"); - int a1end = scenarioResult.getIOLog().indexOf("blockingactivity1 finished"); - int a2start = scenarioResult.getIOLog().indexOf("running blockingactivity2"); - assertThat(a1end).isLessThan(a2start); - } - - @Test - public void testAwaitFinished() { - ScenarioResult scenarioResult = runScenario("awaitfinished"); - scenarioResult.reportToLog(); - } - - @Test - public void testStartStop() { - ScenarioResult scenarioResult = runScenario("startstopdiag"); - scenarioResult.reportToLog(); - int startedAt = scenarioResult.getIOLog().indexOf("starting activity teststartstopdiag"); - int stoppedAt = scenarioResult.getIOLog().indexOf("stopped activity teststartstopdiag"); - assertThat(startedAt).isGreaterThan(0); - assertThat(stoppedAt).isGreaterThan(startedAt); - } - - @Test - public void testThreadChange() { - ScenarioResult scenarioResult = runScenario("threadchange"); - int changedTo1At = scenarioResult.getIOLog().indexOf("threads now 1"); - int changedTo5At = scenarioResult.getIOLog().indexOf("threads now 5"); - assertThat(changedTo1At).isGreaterThan(0); - assertThat(changedTo5At).isGreaterThan(changedTo1At); - } - - @Test - public void testReadMetric() { - ScenarioResult scenarioResult = runScenario("readmetrics"); - assertThat(scenarioResult.getIOLog()).contains("count: "); - } - - @Test - public void testExceptionPropagationFromMotorThread() { - ScenarioResult scenarioResult = runScenario("activityerror"); - assertThat(scenarioResult.getException()).isPresent(); - assertThat(scenarioResult.getException().get().getMessage()).contains("For input string: \"unparsable\""); - } - - @Test - public void testExceptionPropagationFromActivityInit() { - ScenarioResult scenarioResult = runScenario("activityiniterror"); - assertThat(scenarioResult.getException()).isPresent(); - assertThat(scenarioResult.getException().get().getMessage()).contains("For input string: \"unparsable\""); - assertThat(scenarioResult.getException()).isNotNull(); - } - - @Test - public void testReportedCoDelayBursty() { - ScenarioResult scenarioResult = runScenario("cocycledelay_bursty"); - assertThat(scenarioResult.getIOLog()).contains("step1 metrics.waittime="); - assertThat(scenarioResult.getIOLog()).contains("step2 metrics.waittime="); - String iolog = scenarioResult.getIOLog(); - System.out.println(iolog); - assertThat(iolog).contains("waittime trended back down as expected"); - } - - @Test - public void testReportedCoDelayStrict() { - ScenarioResult scenarioResult = runScenario("cocycledelay_strict"); - assertThat(scenarioResult.getIOLog()).contains("step1 cycles.waittime="); - assertThat(scenarioResult.getIOLog()).contains("step2 cycles.waittime="); - String iolog = scenarioResult.getIOLog(); - System.out.println(iolog); - // TODO: ensure that waittime is staying the same or increasing - // after investigating minor decreasing effect - } - - - @Test - public void testCycleRateChange() { - ScenarioResult scenarioResult = runScenario("cycle_rate_change"); - String ioLog = scenarioResult.getIOLog(); - assertThat(ioLog).contains("cycles adjusted, exiting on iteration"); - } - - @Test - public void testExitLogic() { - ScenarioResult scenarioResult = runScenario( - "basicdiag", - "type", "diag", "cyclerate", "5", "erroroncycle", "10", "cycles", "2000" - ); - } + // The tests below are being disabled and eventually removed. + // The async versions are higher sensitivity and equivalent in + // every other way. + // This should reduce the build time for integrated testing. + +// @Test +// public void testStrideRateOnly() { +// ScenarioResult scenarioResult = runScenario("stride_rate"); +// String iolog = scenarioResult.getIOLog(); +// System.out.println("iolog\n" + iolog); +// Pattern p = Pattern.compile(".*stride_rate.strides.servicetime.meanRate = (\\d[.\\d]+).*", Pattern.DOTALL); +// Matcher m = p.matcher(iolog); +// assertThat(m.matches()).isTrue(); +// +// String digits = m.group(1); +// assertThat(digits).isNotEmpty(); +// double rate = Double.valueOf(digits); +// assertThat(rate).isCloseTo(10000.0D, Offset.offset(1000D)); +// } +// +// @Test +// public void testPhaseRateOnly() { +// ScenarioResult scenarioResult = runScenario("phase_rate"); +// String iolog = scenarioResult.getIOLog(); +// System.out.println("iolog\n" + iolog); +// Pattern p = Pattern.compile(".*phase_rate.phases.servicetime.meanRate = (\\d[.\\d]+).*", Pattern.DOTALL); +// Matcher m = p.matcher(iolog); +// assertThat(m.matches()).isTrue(); +// +// String digits = m.group(1); +// assertThat(digits).isNotEmpty(); +// double rate = Double.valueOf(digits); +// assertThat(rate).isCloseTo(25000.0D, Offset.offset(5000D)); +// } +// +// +// @Test +// public void testExtensionPoint() { +// ScenarioResult scenarioResult = runScenario("extensions"); +// assertThat(scenarioResult.getIOLog()).contains("sum is 46"); +// } +// +// @Test +// public void testLinkedInput() { +// ScenarioResult scenarioResult = runScenario("linkedinput"); +// Pattern p = Pattern.compile(".*started leader.*started follower.*stopped leader.*stopped follower.*", +// Pattern.DOTALL); +// assertThat(p.matcher(scenarioResult.getIOLog()).matches()).isTrue(); +// } +// +// @Test +// public void testExtensionCsvLogger() { +// ScenarioResult scenarioResult = runScenario("extension_csvmetrics"); +// assertThat(scenarioResult.getIOLog()).contains("started new " + +// "csvlogger: logs/csvmetricstestdir"); +// } +// +// +// @Test +// public void testScriptParamsVariable() { +// ScenarioResult scenarioResult = runScenario("params_variable", "one", "two", "three", "four"); +// assertThat(scenarioResult.getIOLog()).contains("params.get(\"one\")='two'"); +// assertThat(scenarioResult.getIOLog()).contains("params.get(\"three\")='four'"); +// assertThat(scenarioResult.getIOLog()).contains("params.size()=2"); +// assertThat(scenarioResult.getIOLog()).contains("params.get(\"three\") [overridden-three-five]='five'"); +// assertThat(scenarioResult.getIOLog()).contains("params.get(\"four\") [defaulted-four-niner]='niner'"); +// } +// +// @Test +// public void testExtensionHistoStatsLogger() throws IOException { +// ScenarioResult scenarioResult = runScenario("extension_histostatslogger"); +// assertThat(scenarioResult.getIOLog()).contains("stdout started " + +// "logging to logs/histostats.csv"); +// List strings = Files.readAllLines(Paths.get( +// "logs/histostats.csv")); +// String logdata = strings.stream().collect(Collectors.joining("\n")); +// assertThat(logdata).contains("min,p25,p50,p75,p90,p95,"); +// assertThat(logdata.split("Tag=testhistostatslogger.cycles.servicetime,").length).isGreaterThanOrEqualTo(3); +// } +// +// @Test +// public void testExtensionHistogramLogger() throws IOException { +// ScenarioResult scenarioResult = runScenario("extension_histologger"); +// assertThat(scenarioResult.getIOLog()).contains("stdout started logging to hdrhistodata.log"); +// List strings = Files.readAllLines(Paths.get("hdrhistodata.log")); +// String logdata = strings.stream().collect(Collectors.joining("\n")); +// assertThat(logdata).contains(",HIST"); +// assertThat(logdata.split("Tag=testhistologger.cycles.servicetime,").length).isGreaterThanOrEqualTo(3); +// } +// +// @Test +// public void testBlockingRun() { +// ScenarioResult scenarioResult = runScenario("blockingrun"); +// int a1end = scenarioResult.getIOLog().indexOf("blockingactivity1 finished"); +// int a2start = scenarioResult.getIOLog().indexOf("running blockingactivity2"); +// assertThat(a1end).isLessThan(a2start); +// } +// +// @Test +// public void testAwaitFinished() { +// ScenarioResult scenarioResult = runScenario("awaitfinished"); +// scenarioResult.reportToLog(); +// } +// +// @Test +// public void testStartStop() { +// ScenarioResult scenarioResult = runScenario("startstopdiag"); +// scenarioResult.reportToLog(); +// int startedAt = scenarioResult.getIOLog().indexOf("starting activity teststartstopdiag"); +// int stoppedAt = scenarioResult.getIOLog().indexOf("stopped activity teststartstopdiag"); +// assertThat(startedAt).isGreaterThan(0); +// assertThat(stoppedAt).isGreaterThan(startedAt); +// } +// +// @Test +// public void testThreadChange() { +// ScenarioResult scenarioResult = runScenario("threadchange"); +// int changedTo1At = scenarioResult.getIOLog().indexOf("threads now 1"); +// int changedTo5At = scenarioResult.getIOLog().indexOf("threads now 5"); +// assertThat(changedTo1At).isGreaterThan(0); +// assertThat(changedTo5At).isGreaterThan(changedTo1At); +// } +// +// @Test +// public void testReadMetric() { +// ScenarioResult scenarioResult = runScenario("readmetrics"); +// assertThat(scenarioResult.getIOLog()).contains("count: "); +// } +// +// @Test +// public void testExceptionPropagationFromMotorThread() { +// ScenarioResult scenarioResult = runScenario("activityerror"); +// assertThat(scenarioResult.getException()).isPresent(); +// assertThat(scenarioResult.getException().get().getMessage()).contains("For input string: \"unparsable\""); +// } +// +// @Test +// public void testExceptionPropagationFromActivityInit() { +// ScenarioResult scenarioResult = runScenario("activityiniterror"); +// assertThat(scenarioResult.getException()).isPresent(); +// assertThat(scenarioResult.getException().get().getMessage()).contains("For input string: \"unparsable\""); +// assertThat(scenarioResult.getException()).isNotNull(); +// } +// +// @Test +// public void testReportedCoDelayBursty() { +// ScenarioResult scenarioResult = runScenario("cocycledelay_bursty"); +// assertThat(scenarioResult.getIOLog()).contains("step1 metrics.waittime="); +// assertThat(scenarioResult.getIOLog()).contains("step2 metrics.waittime="); +// String iolog = scenarioResult.getIOLog(); +// System.out.println(iolog); +// assertThat(iolog).contains("waittime trended back down as expected"); +// } +// +// @Test +// public void testReportedCoDelayStrict() { +// ScenarioResult scenarioResult = runScenario("cocycledelay_strict"); +// assertThat(scenarioResult.getIOLog()).contains("step1 cycles.waittime="); +// assertThat(scenarioResult.getIOLog()).contains("step2 cycles.waittime="); +// String iolog = scenarioResult.getIOLog(); +// System.out.println(iolog); +// // TODO: ensure that waittime is staying the same or increasing +// // after investigating minor decreasing effect +// } +// +// +// @Test +// public void testCycleRateChange() { +// ScenarioResult scenarioResult = runScenario("cycle_rate_change"); +// String ioLog = scenarioResult.getIOLog(); +// assertThat(ioLog).contains("cycles adjusted, exiting on iteration"); +// } +// +// @Test +// public void testExitLogic() { +// ScenarioResult scenarioResult = runScenario( +// "basicdiag", +// "type", "diag", "cyclerate", "5", "erroroncycle", "10", "cycles", "2000" +// ); +// } } \ No newline at end of file