mirror of
https://github.com/nosqlbench/nosqlbench.git
synced 2025-02-25 18:55:28 -06:00
make graal js and polyglot support primary
This commit is contained in:
@@ -16,22 +16,24 @@ package io.nosqlbench.engine.core.script;
|
||||
|
||||
import ch.qos.logback.classic.Logger;
|
||||
import com.codahale.metrics.MetricRegistry;
|
||||
import io.nosqlbench.engine.core.ProgressIndicator;
|
||||
import io.nosqlbench.engine.core.ScenarioController;
|
||||
import io.nosqlbench.engine.core.ScenarioLogger;
|
||||
import io.nosqlbench.engine.core.ScenarioResult;
|
||||
import com.oracle.truffle.js.scriptengine.GraalJSScriptEngine;
|
||||
import io.nosqlbench.engine.core.*;
|
||||
import io.nosqlbench.engine.core.metrics.PolyglotMetricRegistryBindings;
|
||||
import io.nosqlbench.nb.api.errors.BasicError;
|
||||
import io.nosqlbench.engine.api.extensions.ScriptingPluginInfo;
|
||||
import io.nosqlbench.engine.api.metrics.ActivityMetrics;
|
||||
import io.nosqlbench.engine.core.metrics.MetricRegistryBindings;
|
||||
import io.nosqlbench.engine.core.metrics.NashornMetricRegistryBindings;
|
||||
import io.nosqlbench.engine.api.scripting.ScriptEnvBuffer;
|
||||
import org.graalvm.polyglot.Context;
|
||||
import org.graalvm.polyglot.EnvironmentAccess;
|
||||
import org.graalvm.polyglot.HostAccess;
|
||||
import org.graalvm.polyglot.PolyglotAccess;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import javax.script.*;
|
||||
import java.io.IOException;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.charset.Charset;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
@@ -55,7 +57,6 @@ public class Scenario implements Callable<ScenarioResult> {
|
||||
private String name;
|
||||
private ScenarioLogger scenarioLogger;
|
||||
private ScriptParams scenarioScriptParams;
|
||||
private boolean areChartsEnabled;
|
||||
private Engine engine = Engine.Graalvm;
|
||||
|
||||
public enum Engine {
|
||||
@@ -107,15 +108,29 @@ public class Scenario implements Callable<ScenarioResult> {
|
||||
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);
|
||||
Context.Builder contextSettings = Context.newBuilder("js")
|
||||
.allowHostAccess(HostAccess.ALL)
|
||||
.allowNativeAccess(true)
|
||||
.allowCreateThread(true)
|
||||
.allowIO(true)
|
||||
.allowHostClassLookup(s -> true)
|
||||
.allowHostClassLoading(true)
|
||||
.allowCreateProcess(true)
|
||||
.allowAllAccess(true)
|
||||
.allowEnvironmentAccess(EnvironmentAccess.INHERIT)
|
||||
.allowPolyglotAccess(PolyglotAccess.ALL)
|
||||
.option("js.ecmascript-version", "2020")
|
||||
.option("js.nashorn-compat", "true");
|
||||
|
||||
scriptEngine = GraalJSScriptEngine.create(null, contextSettings);
|
||||
|
||||
try {
|
||||
scriptEngine.put("javaObj", new Object());
|
||||
scriptEngine.eval("(javaObj instanceof Java.type('java.lang.Object'));");
|
||||
} catch (ScriptException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -128,11 +143,20 @@ public class Scenario implements Callable<ScenarioResult> {
|
||||
scriptEngine.setContext(scriptEnv);
|
||||
|
||||
scriptEngine.put("params", scenarioScriptParams);
|
||||
scriptEngine.put("scenario", scenarioController);
|
||||
scriptEngine.put("activities", new ActivityBindings(scenarioController));
|
||||
scriptEngine.put("metrics", new MetricRegistryBindings(metricRegistry));
|
||||
|
||||
for (ScriptingPluginInfo extensionDescriptor : SandboxExtensionFinder.findAll()) {
|
||||
if (engine == Engine.Graalvm) {
|
||||
scriptEngine.put("scenario", new PolyglotScenarioController(scenarioController));
|
||||
scriptEngine.put("metrics", new PolyglotMetricRegistryBindings(metricRegistry));
|
||||
scriptEngine.put("activities", new NashornActivityBindings(scenarioController));
|
||||
} else if (engine == Engine.Nashorn) {
|
||||
scriptEngine.put("scenario", scenarioController);
|
||||
scriptEngine.put("metrics", new NashornMetricRegistryBindings(metricRegistry));
|
||||
scriptEngine.put("activities", new NashornActivityBindings(scenarioController));
|
||||
} else {
|
||||
throw new RuntimeException("Unsupported engine: " + engine);
|
||||
}
|
||||
|
||||
for (ScriptingPluginInfo<?> extensionDescriptor : SandboxExtensionFinder.findAll()) {
|
||||
if (!extensionDescriptor.isAutoLoading()) {
|
||||
logger.info("Not loading " + extensionDescriptor + ", autoloading is false");
|
||||
continue;
|
||||
@@ -256,8 +280,11 @@ public class Scenario implements Callable<ScenarioResult> {
|
||||
public void addScenarioScriptParams(ScriptParams scenarioScriptParams) {
|
||||
this.scenarioScriptParams = scenarioScriptParams;
|
||||
}
|
||||
|
||||
public void addScenarioScriptParams(Map<String, String> scriptParams) {
|
||||
addScenarioScriptParams(new ScriptParams() {{ putAll(scriptParams);}});
|
||||
addScenarioScriptParams(new ScriptParams() {{
|
||||
putAll(scriptParams);
|
||||
}});
|
||||
}
|
||||
|
||||
public void enableCharting() {
|
||||
|
||||
Reference in New Issue
Block a user