graal js support

This commit is contained in:
Jonathan Shook 2020-04-22 07:31:05 -05:00
parent be93ee52ea
commit aeb9765543
7 changed files with 141 additions and 5 deletions

View File

@ -4,6 +4,7 @@ import ch.qos.logback.classic.Level;
import io.nosqlbench.engine.api.metrics.IndicatorMode; import io.nosqlbench.engine.api.metrics.IndicatorMode;
import io.nosqlbench.engine.api.scenarios.NBCLIScenarioParser; import io.nosqlbench.engine.api.scenarios.NBCLIScenarioParser;
import io.nosqlbench.engine.api.util.Unit; 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.Content;
import io.nosqlbench.nb.api.content.NBIO; import io.nosqlbench.nb.api.content.NBIO;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -74,6 +75,10 @@ public class NBCLIOptions {
private final static String ENABLE_CHART = "--enable-chart"; private final static String ENABLE_CHART = "--enable-chart";
private final static String DOCKER_METRICS = "--docker-metrics"; 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<String> RESERVED_WORDS = new HashSet<>() {{ public static final Set<String> RESERVED_WORDS = new HashSet<>() {{
addAll( addAll(
Arrays.asList( Arrays.asList(
@ -119,6 +124,8 @@ public class NBCLIOptions {
private String wantsToCopyWorkload = null; private String wantsToCopyWorkload = null;
private boolean wantsWorkloadsList = false; private boolean wantsWorkloadsList = false;
private final List<String> wantsToIncludePaths = new ArrayList<>(); private final List<String> wantsToIncludePaths = new ArrayList<>();
private Scenario.Engine engine = Scenario.Engine.Graalvm;
public NBCLIOptions(String[] args) { public NBCLIOptions(String[] args) {
parse(args); parse(args);
@ -174,6 +181,14 @@ public class NBCLIOptions {
} }
switch (word) { 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: case SHOW_SCRIPT:
arglist.removeFirst(); arglist.removeFirst();
showScript = true; showScript = true;
@ -402,6 +417,10 @@ public class NBCLIOptions {
return levels; return levels;
} }
public Scenario.Engine getScriptingEngine() {
return engine;
}
public List<LoggerConfig> getHistoLoggerConfigs() { public List<LoggerConfig> getHistoLoggerConfigs() {
List<LoggerConfig> configs = histoLoggerConfigs.stream().map(LoggerConfig::new).collect(Collectors.toList()); List<LoggerConfig> configs = histoLoggerConfigs.stream().map(LoggerConfig::new).collect(Collectors.toList());
checkLoggerConfigs(configs, LOG_HISTOGRAMS); checkLoggerConfigs(configs, LOG_HISTOGRAMS);

View File

@ -81,6 +81,33 @@
<artifactId>junit</artifactId> <artifactId>junit</artifactId>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<!-- graalvm -->
<dependency>
<groupId>org.graalvm.sdk</groupId>
<artifactId>graal-sdk</artifactId>
</dependency>
<dependency>
<groupId>org.graalvm.js</groupId>
<artifactId>js</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.graalvm.js</groupId>
<artifactId>js-scriptengine</artifactId>
</dependency>
<dependency>
<groupId>org.graalvm.tools</groupId>
<artifactId>profiler</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.graalvm.tools</groupId>
<artifactId>chromeinspector</artifactId>
<scope>runtime</scope>
</dependency>
<!-- only compile scope --> <!-- only compile scope -->
</dependencies> </dependencies>

View File

@ -105,6 +105,11 @@ public class ScenarioController {
public synchronized void run(String activityDefString) { public synchronized void run(String activityDefString) {
run(Integer.MAX_VALUE, 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) { public synchronized void run(ActivityDef activityDef) {
run(Integer.MAX_VALUE, activityDef); run(Integer.MAX_VALUE, activityDef);

View File

@ -56,6 +56,12 @@ public class Scenario implements Callable<ScenarioResult> {
private ScenarioLogger scenarioLogger; private ScenarioLogger scenarioLogger;
private ScriptParams scenarioScriptParams; private ScriptParams scenarioScriptParams;
private boolean areChartsEnabled; private boolean areChartsEnabled;
private Engine engine = Engine.Graalvm;
public enum Engine {
Nashorn,
Graalvm
}
public Scenario(String name, String progressInterval) { public Scenario(String name, String progressInterval) {
this.name = name; this.name = name;
@ -68,6 +74,7 @@ public class Scenario implements Callable<ScenarioResult> {
public Scenario addScriptText(String scriptText) { public Scenario addScriptText(String scriptText) {
scripts.add(scriptText); scripts.add(scriptText);
this.engine = engine;
return this; return this;
} }
@ -91,16 +98,35 @@ public class Scenario implements Callable<ScenarioResult> {
private void init() { private void init() {
logger.info("Using engine " + engine.toString());
MetricRegistry metricRegistry = ActivityMetrics.getMetricRegistry(); MetricRegistry metricRegistry = ActivityMetrics.getMetricRegistry();
scriptEngine = engineManager.getEngineByName("nashorn"); switch (engine) {
scriptEnv = new ScenarioContext(scenarioController); case Nashorn:
scriptEngine.setContext(scriptEnv); 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(); scenarioController = new ScenarioController();
if (!progressInterval.equals("disabled")) { if (!progressInterval.equals("disabled")) {
progressIndicator = new ProgressIndicator(scenarioController,progressInterval); progressIndicator = new ProgressIndicator(scenarioController,progressInterval);
} }
scriptEnv = new ScenarioContext(scenarioController);
scriptEngine.setContext(scriptEnv);
scriptEngine.put("params", scenarioScriptParams); scriptEngine.put("params", scenarioScriptParams);
scriptEngine.put("scenario", scenarioController); scriptEngine.put("scenario", scenarioController);
scriptEngine.put("activities", new ActivityBindings(scenarioController)); scriptEngine.put("activities", new ActivityBindings(scenarioController));

View File

@ -75,6 +75,7 @@
<source.plugin.version>3.0.1</source.plugin.version> <source.plugin.version>3.0.1</source.plugin.version>
<surefire.plugin.version>3.0.0-M4</surefire.plugin.version> <surefire.plugin.version>3.0.0-M4</surefire.plugin.version>
<assertj.version>3.15.0</assertj.version> <assertj.version>3.15.0</assertj.version>
<graalvm.version>20.0.0</graalvm.version>
</properties> </properties>
<name>${project.artifactId}</name> <name>${project.artifactId}</name>
@ -439,6 +440,36 @@
<version>${assertj.version}</version> <version>${assertj.version}</version>
</dependency> </dependency>
<!-- graalvm -->
<dependency>
<groupId>org.graalvm.sdk</groupId>
<artifactId>graal-sdk</artifactId>
<version>${graalvm.version}</version>
</dependency>
<dependency>
<groupId>org.graalvm.js</groupId>
<artifactId>js</artifactId>
<version>${graalvm.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.graalvm.js</groupId>
<artifactId>js-scriptengine</artifactId>
<version>${graalvm.version}</version>
</dependency>
<dependency>
<groupId>org.graalvm.tools</groupId>
<artifactId>profiler</artifactId>
<version>${graalvm.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.graalvm.tools</groupId>
<artifactId>chromeinspector</artifactId>
<version>${graalvm.version}</version>
<scope>runtime</scope>
</dependency>
</dependencies> </dependencies>
</dependencyManagement> </dependencyManagement>

View File

@ -20,12 +20,15 @@ package io.nosqlbench.engine.core.script;
import io.nosqlbench.engine.core.ScenarioLogger; import io.nosqlbench.engine.core.ScenarioLogger;
import io.nosqlbench.engine.core.ScenarioResult; import io.nosqlbench.engine.core.ScenarioResult;
import io.nosqlbench.engine.core.ScenariosResults; import io.nosqlbench.engine.core.ScenariosResults;
import org.apache.commons.compress.utils.IOUtils;
import org.assertj.core.data.Offset; import org.assertj.core.data.Offset;
import org.junit.BeforeClass; import org.junit.BeforeClass;
import org.junit.Ignore; import org.junit.Ignore;
import org.junit.Test; import org.junit.Test;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.util.HashMap; import java.util.HashMap;
@ -53,7 +56,18 @@ public class AsyncScriptIntegrationTests {
ScenariosExecutor e = new ScenariosExecutor(AsyncScriptIntegrationTests.class.getSimpleName() + ":" + scriptname, 1); ScenariosExecutor e = new ScenariosExecutor(AsyncScriptIntegrationTests.class.getSimpleName() + ":" + scriptname, 1);
Scenario s = new Scenario(scenarioName); Scenario s = new Scenario(scenarioName);
s.addScenarioScriptParams(paramsMap); 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(); ScenarioLogger scenarioLogger = new ScenarioLogger(s).setMaxLogs(0).setLogDir("logs/test").start();
e.execute(s, scenarioLogger); e.execute(s, scenarioLogger);
ScenariosResults scenariosResults = e.awaitAllResults(); ScenariosResults scenariosResults = e.awaitAllResults();

View File

@ -20,10 +20,14 @@ package io.nosqlbench.engine.core.script;
import io.nosqlbench.engine.core.ScenarioLogger; import io.nosqlbench.engine.core.ScenarioLogger;
import io.nosqlbench.engine.core.ScenarioResult; import io.nosqlbench.engine.core.ScenarioResult;
import io.nosqlbench.engine.core.ScenariosResults; import io.nosqlbench.engine.core.ScenariosResults;
import org.apache.commons.compress.utils.IOUtils;
import org.assertj.core.data.Offset; import org.assertj.core.data.Offset;
import org.junit.BeforeClass; import org.junit.BeforeClass;
import org.junit.Test; import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.regex.Matcher; import java.util.regex.Matcher;
@ -47,7 +51,17 @@ public class ScriptIntegrationTests {
ScenariosExecutor e = new ScenariosExecutor(ScriptIntegrationTests.class.getSimpleName() + ":" + scriptname, 1); ScenariosExecutor e = new ScenariosExecutor(ScriptIntegrationTests.class.getSimpleName() + ":" + scriptname, 1);
Scenario s = new Scenario(scenarioName); Scenario s = new Scenario(scenarioName);
s.addScenarioScriptParams(paramsMap); 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(); ScenarioLogger scenarioLogger = new ScenarioLogger(s).setMaxLogs(0).setLogDir("logs/test").start();
e.execute(s, scenarioLogger); e.execute(s, scenarioLogger);
ScenariosResults scenariosResults = e.awaitAllResults(); ScenariosResults scenariosResults = e.awaitAllResults();