From aeb976554360277535cf734471e7d060d6bdd2e2 Mon Sep 17 00:00:00 2001 From: Jonathan Shook Date: Wed, 22 Apr 2020 07:31:05 -0500 Subject: [PATCH] graal js support --- .../nosqlbench/engine/cli/NBCLIOptions.java | 19 +++++++++++ engine-core/pom.xml | 27 ++++++++++++++++ .../engine/core/ScenarioController.java | 5 +++ .../engine/core/script/Scenario.java | 32 +++++++++++++++++-- mvn-defaults/pom.xml | 31 ++++++++++++++++++ .../script/AsyncScriptIntegrationTests.java | 16 +++++++++- .../core/script/ScriptIntegrationTests.java | 16 +++++++++- 7 files changed, 141 insertions(+), 5 deletions(-) diff --git a/engine-cli/src/main/java/io/nosqlbench/engine/cli/NBCLIOptions.java b/engine-cli/src/main/java/io/nosqlbench/engine/cli/NBCLIOptions.java index c7805f633..9c56b4350 100644 --- a/engine-cli/src/main/java/io/nosqlbench/engine/cli/NBCLIOptions.java +++ b/engine-cli/src/main/java/io/nosqlbench/engine/cli/NBCLIOptions.java @@ -4,6 +4,7 @@ import ch.qos.logback.classic.Level; import io.nosqlbench.engine.api.metrics.IndicatorMode; import io.nosqlbench.engine.api.scenarios.NBCLIScenarioParser; import io.nosqlbench.engine.api.util.Unit; +import io.nosqlbench.engine.core.script.Scenario; import io.nosqlbench.nb.api.content.Content; import io.nosqlbench.nb.api.content.NBIO; import org.slf4j.Logger; @@ -74,6 +75,10 @@ public class NBCLIOptions { private final static String ENABLE_CHART = "--enable-chart"; private final static String DOCKER_METRICS = "--docker-metrics"; + private static final String GRAALVM_ENGINE = "--graalvm"; + private static final String NASHORN_ENGINE = "--nashorn"; + + public static final Set RESERVED_WORDS = new HashSet<>() {{ addAll( Arrays.asList( @@ -119,6 +124,8 @@ public class NBCLIOptions { private String wantsToCopyWorkload = null; private boolean wantsWorkloadsList = false; private final List wantsToIncludePaths = new ArrayList<>(); + private Scenario.Engine engine = Scenario.Engine.Graalvm; + public NBCLIOptions(String[] args) { parse(args); @@ -174,6 +181,14 @@ public class NBCLIOptions { } switch (word) { + case GRAALVM_ENGINE: + engine = Scenario.Engine.Graalvm; + arglist.removeFirst(); + break; + case NASHORN_ENGINE: + engine = Scenario.Engine.Nashorn; + arglist.removeFirst(); + break; case SHOW_SCRIPT: arglist.removeFirst(); showScript = true; @@ -402,6 +417,10 @@ public class NBCLIOptions { return levels; } + public Scenario.Engine getScriptingEngine() { + return engine; + } + public List getHistoLoggerConfigs() { List configs = histoLoggerConfigs.stream().map(LoggerConfig::new).collect(Collectors.toList()); checkLoggerConfigs(configs, LOG_HISTOGRAMS); diff --git a/engine-core/pom.xml b/engine-core/pom.xml index 2e6e72806..0e37ee1ea 100644 --- a/engine-core/pom.xml +++ b/engine-core/pom.xml @@ -81,6 +81,33 @@ junit test + + + + org.graalvm.sdk + graal-sdk + + + org.graalvm.js + js + runtime + + + org.graalvm.js + js-scriptengine + + + org.graalvm.tools + profiler + runtime + + + org.graalvm.tools + chromeinspector + runtime + + + diff --git a/engine-core/src/main/java/io/nosqlbench/engine/core/ScenarioController.java b/engine-core/src/main/java/io/nosqlbench/engine/core/ScenarioController.java index 72441c396..ad808211a 100644 --- a/engine-core/src/main/java/io/nosqlbench/engine/core/ScenarioController.java +++ b/engine-core/src/main/java/io/nosqlbench/engine/core/ScenarioController.java @@ -105,6 +105,11 @@ public class ScenarioController { public synchronized void run(String activityDefString) { run(Integer.MAX_VALUE, activityDefString); } +// +// public synchronized void run(Value v) { +// logger.debug("run(Value) called with:" + v); +// throw new RuntimeException("fix it"); +// } public synchronized void run(ActivityDef activityDef) { run(Integer.MAX_VALUE, activityDef); diff --git a/engine-core/src/main/java/io/nosqlbench/engine/core/script/Scenario.java b/engine-core/src/main/java/io/nosqlbench/engine/core/script/Scenario.java index 9ddc19472..e8febec15 100644 --- a/engine-core/src/main/java/io/nosqlbench/engine/core/script/Scenario.java +++ b/engine-core/src/main/java/io/nosqlbench/engine/core/script/Scenario.java @@ -56,6 +56,12 @@ public class Scenario implements Callable { private ScenarioLogger scenarioLogger; private ScriptParams scenarioScriptParams; private boolean areChartsEnabled; + private Engine engine = Engine.Graalvm; + + public enum Engine { + Nashorn, + Graalvm + } public Scenario(String name, String progressInterval) { this.name = name; @@ -68,6 +74,7 @@ public class Scenario implements Callable { public Scenario addScriptText(String scriptText) { scripts.add(scriptText); + this.engine = engine; return this; } @@ -91,16 +98,35 @@ public class Scenario implements Callable { private void init() { + logger.info("Using engine " + engine.toString()); + MetricRegistry metricRegistry = ActivityMetrics.getMetricRegistry(); - scriptEngine = engineManager.getEngineByName("nashorn"); - scriptEnv = new ScenarioContext(scenarioController); - scriptEngine.setContext(scriptEnv); + switch (engine) { + case Nashorn: + scriptEngine = engineManager.getEngineByName("nashorn"); + break; + case Graalvm: + scriptEngine = engineManager.getEngineByName("graal.js"); + Bindings bindings = scriptEngine.getBindings(ScriptContext.ENGINE_SCOPE); + bindings.put("polyglot.js.allowHostAccess", true); + bindings.put("polyglot.js.allowNativeAccess", true); + bindings.put("polyglot.js.allowCreateThread", true); + bindings.put("polyglot.js.allowIO", true); + bindings.put("polyglot.js.allowHostClassLookup", true); + bindings.put("polyglot.js.allowHostClassLoading", true); + bindings.put("polyglot.js.allowAllAccess", true); + break; + } + scenarioController = new ScenarioController(); if (!progressInterval.equals("disabled")) { progressIndicator = new ProgressIndicator(scenarioController,progressInterval); } + scriptEnv = new ScenarioContext(scenarioController); + scriptEngine.setContext(scriptEnv); + scriptEngine.put("params", scenarioScriptParams); scriptEngine.put("scenario", scenarioController); scriptEngine.put("activities", new ActivityBindings(scenarioController)); diff --git a/mvn-defaults/pom.xml b/mvn-defaults/pom.xml index d980e480c..a942438ba 100644 --- a/mvn-defaults/pom.xml +++ b/mvn-defaults/pom.xml @@ -75,6 +75,7 @@ 3.0.1 3.0.0-M4 3.15.0 + 20.0.0 ${project.artifactId} @@ -439,6 +440,36 @@ ${assertj.version} + + + org.graalvm.sdk + graal-sdk + ${graalvm.version} + + + org.graalvm.js + js + ${graalvm.version} + runtime + + + org.graalvm.js + js-scriptengine + ${graalvm.version} + + + org.graalvm.tools + profiler + ${graalvm.version} + runtime + + + org.graalvm.tools + chromeinspector + ${graalvm.version} + runtime + + diff --git a/nb/src/test/java/io/nosqlbench/engine/core/script/AsyncScriptIntegrationTests.java b/nb/src/test/java/io/nosqlbench/engine/core/script/AsyncScriptIntegrationTests.java index 70134ef98..7d4b36cb1 100644 --- a/nb/src/test/java/io/nosqlbench/engine/core/script/AsyncScriptIntegrationTests.java +++ b/nb/src/test/java/io/nosqlbench/engine/core/script/AsyncScriptIntegrationTests.java @@ -20,12 +20,15 @@ package io.nosqlbench.engine.core.script; import io.nosqlbench.engine.core.ScenarioLogger; import io.nosqlbench.engine.core.ScenarioResult; import io.nosqlbench.engine.core.ScenariosResults; +import org.apache.commons.compress.utils.IOUtils; import org.assertj.core.data.Offset; import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test; import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; import java.util.HashMap; @@ -53,7 +56,18 @@ public class AsyncScriptIntegrationTests { ScenariosExecutor e = new ScenariosExecutor(AsyncScriptIntegrationTests.class.getSimpleName() + ":" + scriptname, 1); Scenario s = new Scenario(scenarioName); s.addScenarioScriptParams(paramsMap); - s.addScriptText("load('classpath:scripts/async/" + scriptname + ".js');"); + + ClassLoader cl = AsyncScriptIntegrationTests.class.getClassLoader(); + String script; + try { + InputStream sstream = cl.getResourceAsStream("scripts/async/" + scriptname + ".js"); + byte[] bytes = IOUtils.toByteArray(sstream); + script = new String(bytes, StandardCharsets.UTF_8); + } catch (IOException ex) { + throw new RuntimeException(ex); + } + s.addScriptText(script); +// s.addScriptText("load('classpath:scripts/async/" + scriptname + ".js');"); ScenarioLogger scenarioLogger = new ScenarioLogger(s).setMaxLogs(0).setLogDir("logs/test").start(); e.execute(s, scenarioLogger); ScenariosResults scenariosResults = e.awaitAllResults(); 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 a7a8fe241..7846afa58 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 @@ -20,10 +20,14 @@ package io.nosqlbench.engine.core.script; import io.nosqlbench.engine.core.ScenarioLogger; import io.nosqlbench.engine.core.ScenarioResult; import io.nosqlbench.engine.core.ScenariosResults; +import org.apache.commons.compress.utils.IOUtils; import org.assertj.core.data.Offset; import org.junit.BeforeClass; import org.junit.Test; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; @@ -47,7 +51,17 @@ public class ScriptIntegrationTests { ScenariosExecutor e = new ScenariosExecutor(ScriptIntegrationTests.class.getSimpleName() + ":" + scriptname, 1); Scenario s = new Scenario(scenarioName); s.addScenarioScriptParams(paramsMap); - s.addScriptText("load('classpath:scripts/sync/" + scriptname + ".js');"); + ClassLoader cl = AsyncScriptIntegrationTests.class.getClassLoader(); + String script; + try { + InputStream sstream = cl.getResourceAsStream("scripts/sync/" + scriptname + ".js"); + byte[] bytes = IOUtils.toByteArray(sstream); + script = new String(bytes, StandardCharsets.UTF_8); + } catch (IOException ex) { + throw new RuntimeException(ex); + } + s.addScriptText(script); +// s.addScriptText("load('classpath:scripts/sync/" + scriptname + ".js');"); ScenarioLogger scenarioLogger = new ScenarioLogger(s).setMaxLogs(0).setLogDir("logs/test").start(); e.execute(s, scenarioLogger); ScenariosResults scenariosResults = e.awaitAllResults();