make graal js and polyglot support primary

This commit is contained in:
Jonathan Shook
2020-04-23 12:41:45 -05:00
parent b2a5ba03da
commit 24f32f31b0

View File

@@ -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() {