Skip to content

Commit c4029ee

Browse files
authored
dry-run benchmarks exits when some benchmark fails (#9397)
If some benchmark fails in dry-run (compileOnly) mode, the whole process exits with non-zero return code. Also fixes failing engine compiler benchmarks. # Important Notes Manually added failure: ```diff diff --git a/engine/runtime-benchmarks/src/main/java/org/enso/interpreter/bench/benchmarks/semantic/ArrayProxyBenchmarks.java b/engine/runtime-benchmarks/src/main/java/org/enso/interpreter/bench/benchmarks/semantic/ArrayProxyBenchmarks.java index c8d86cecc..f9f4d7cbc 100644 --- a/engine/runtime-benchmarks/src/main/java/org/enso/interpreter/bench/benchmarks/semantic/ArrayProxyBenchmarks.java +++ b/engine/runtime-benchmarks/src/main/java/org/enso/interpreter/bench/benchmarks/semantic/ArrayProxyBenchmarks.java @@ -95,7 +95,8 @@ public class ArrayProxyBenchmarks { @benchmark public void sumOverComputingProxy(Blackhole matter) { - performBenchmark(matter); + //performBenchmark(matter); + throw new AssertionError("My error"); } @benchmark ``` Run with `sbt "-Dbench.compileOnly=true runtime-benchmarks/benchOnly org.enso.interpreter.bench.benchmarks.semantic.ArrayProxyBenchmarks.sumOverComputingProxy"` fails with: ``` [info] Running benchmarks [org.enso.interpreter.bench.benchmarks.semantic.ArrayProxyBenchmarks.sumOverComputingProxy] in compileOnly mode [info] # JMH version: 1.36 [info] # VM version: JDK 21.0.2, Java HotSpot(TM) 64-Bit Server VM, 21.0.2+13-LTS-jvmci-23.1-b30 [info] # VM invoker: /home/pavel/.sdkman/candidates/java/21.0.2-graal/bin/java [info] # VM options: -XX:ThreadPriorityPolicy=1 -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCIProduct -XX:-UnlockExperimentalVMOptions -Dslf4j.provider=org.slf4j.nop.NOPServiceProvider -Dbench.compileOnly=true --module-path=/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/graalvm/sdk/nativeimage/23.1.2/nativeimage-23.1.2.jar:/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/graalvm/sdk/word/23.1.2/word-23.1.2.jar:/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/graalvm/sdk/jniutils/23.1.2/jniutils-23.1.2.jar:/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/graalvm/sdk/collections/23.1.2/collections-23.1.2.jar:/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/graalvm/polyglot/polyglot/23.1.2/polyglot-23.1.2.jar:/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/graalvm/truffle/truffle-api/23.1.2/truffle-api-23.1.2.jar:/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/graalvm/truffle/truffle-runtime/23.1.2/truffle-runtime-23.1.2.jar:/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/graalvm/truffle/truffle-compiler/23.1.2/truffle-compiler-23.1.2.jar:/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/graalvm/js/js-language/23.1.2/js-language-23.1.2.jar:/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/graalvm/regex/regex/23.1.2/regex-23.1.2.jar:/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/graalvm/shadowed/icu4j/23.1.2/icu4j-23.1.2.jar:/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/graalvm/python/python-language/23.1.2/python-language-23.1.2.jar:/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/graalvm/python/python-resources/23.1.2/python-resources-23.1.2.jar:/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/bouncycastle/bcutil-jdk18on/1.76/bcutil-jdk18on-1.76.jar:/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/bouncycastle/bcpkix-jdk18on/1.76/bcpkix-jdk18on-1.76.jar:/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/bouncycastle/bcprov-jdk18on/1.76/bcprov-jdk18on-1.76.jar:/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/graalvm/llvm/llvm-api/23.1.2/llvm-api-23.1.2.jar:/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/graalvm/truffle/truffle-nfi/23.1.2/truffle-nfi-23.1.2.jar:/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/graalvm/truffle/truffle-nfi-libffi/23.1.2/truffle-nfi-libffi-23.1.2.jar:/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/graalvm/tools/profiler-tool/23.1.2/profiler-tool-23.1.2.jar:/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/graalvm/shadowed/json/23.1.2/json-23.1.2.jar:/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/tukaani/xz/1.9/xz-1.9.jar:/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-api/2.0.9/slf4j-api-2.0.9.jar:/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-nop/2.0.9/slf4j-nop-2.0.9.jar:/home/pavel/dev/enso/runtime.jar --add-modules=org.enso.runtime --add-exports=org.slf4j.nop/org.slf4j.nop=org.slf4j [info] # Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable) [info] # Warmup: <none> [info] # Measurement: 1 iterations, 1 s each [info] # Timeout: 10 min per iteration [info] # Threads: 1 thread, will synchronize iterations [info] # Benchmark mode: Average time, time/op [info] # Benchmark: org.enso.interpreter.bench.benchmarks.semantic.ArrayProxyBenchmarks.sumOverComputingProxy [info] # Run progress: 0.00% complete, ETA 00:00:01 [info] # Fork: N/A, test runs in the host VM [info] # *** WARNING: Non-forked runs may silently omit JVM options, mess up profilers, disable compiler hints, etc. *** [info] # *** WARNING: Use non-forked runs only for debugging purposes, not for actual performance runs. *** [error] SLF4J: Attempting to load provider "org.slf4j.nop.NOPServiceProvider" specified via "slf4j.provider" system property [info] Iteration 1: <failure> [info] java.lang.AssertionError: My error [info] at org.enso.interpreter.bench.benchmarks.semantic.ArrayProxyBenchmarks.sumOverComputingProxy(ArrayProxyBenchmarks.java:99) [info] at org.enso.interpreter.bench.benchmarks.semantic.jmh_generated.ArrayProxyBenchmarks_sumOverComputingProxy_jmhTest.sumOverComputingProxy_avgt_jmhStub(ArrayProxyBenchmarks_sumOverComputingProxy_jmhTest.java:232) [info] at org.enso.interpreter.bench.benchmarks.semantic.jmh_generated.ArrayProxyBenchmarks_sumOverComputingProxy_jmhTest.sumOverComputingProxy_AverageTime(ArrayProxyBenchmarks_sumOverComputingProxy_jmhTest.java:173) [info] at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) [info] at java.base/java.lang.reflect.Method.invoke(Method.java:580) [info] at org.openjdk.jmh.runner.BenchmarkHandler$BenchmarkTask.call(BenchmarkHandler.java:475) [info] at org.openjdk.jmh.runner.BenchmarkHandler$BenchmarkTask.call(BenchmarkHandler.java:458) [info] at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) [info] at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572) [info] at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) [info] at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) [info] at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) [error] Benchmark run failed: Benchmark caught the exception [info] at java.base/java.lang.Thread.run(Thread.java:1583) [error] org.openjdk.jmh.runner.RunnerException: Benchmark caught the exception [error] at org.openjdk.jmh.runner.Runner.runBenchmarks(Runner.java:575) [error] at org.openjdk.jmh.runner.Runner.internalRun(Runner.java:310) [error] at org.openjdk.jmh.runner.Runner.run(Runner.java:209) [error] at org.enso.interpreter.bench.BenchmarksRunner.runCompileOnly(BenchmarksRunner.java:93) [error] at org.enso.interpreter.bench.BenchmarksRunner.run(BenchmarksRunner.java:36) [error] at org.enso.interpreter.bench.benchmarks.RuntimeBenchmarksRunner.main(RuntimeBenchmarksRunner.java:8) [error] Caused by: org.openjdk.jmh.runner.BenchmarkException: Benchmark error during the run [error] at org.openjdk.jmh.runner.BenchmarkHandler.runIteration(BenchmarkHandler.java:424) [error] at org.openjdk.jmh.runner.BaseRunner.runBenchmark(BaseRunner.java:281) [error] at org.openjdk.jmh.runner.BaseRunner.runBenchmark(BaseRunner.java:233) [error] at org.openjdk.jmh.runner.BaseRunner.doSingle(BaseRunner.java:138) [error] at org.openjdk.jmh.runner.BaseRunner.runBenchmarksEmbedded(BaseRunner.java:110) [error] at org.openjdk.jmh.runner.Runner.runBenchmarks(Runner.java:555) [error] ... 5 more [error] Suppressed: java.lang.AssertionError: My error [error] at org.enso.interpreter.bench.benchmarks.semantic.ArrayProxyBenchmarks.sumOverComputingProxy(ArrayProxyBenchmarks.java:99) [error] at org.enso.interpreter.bench.benchmarks.semantic.jmh_generated.ArrayProxyBenchmarks_sumOverComputingProxy_jmhTest.sumOverComputingProxy_avgt_jmhStub(ArrayProxyBenchmarks_sumOverComputingProxy_jmhTest.java:232) [error] at org.enso.interpreter.bench.benchmarks.semantic.jmh_generated.ArrayProxyBenchmarks_sumOverComputingProxy_jmhTest.sumOverComputingProxy_AverageTime(ArrayProxyBenchmarks_sumOverComputingProxy_jmhTest.java:173) [error] at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) [error] at java.base/java.lang.reflect.Method.invoke(Method.java:580) [error] at org.openjdk.jmh.runner.BenchmarkHandler$BenchmarkTask.call(BenchmarkHandler.java:475) [error] at org.openjdk.jmh.runner.BenchmarkHandler$BenchmarkTask.call(BenchmarkHandler.java:458) [error] at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) [error] at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572) [error] at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) [error] at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) [error] at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) [error] at java.base/java.lang.Thread.run(Thread.java:1583) [error] Nonzero exit code returned from runner: 1 [error] (Compile / run) Nonzero exit code returned from runner: 1 [error] Total time: 5 s, completed Mar 13, 2024, 12:49:59 PM ```
1 parent 6017e68 commit c4029ee

File tree

6 files changed

+28
-40
lines changed

6 files changed

+28
-40
lines changed

build.sbt

+1
Original file line numberDiff line numberDiff line change
@@ -1850,6 +1850,7 @@ lazy val `runtime-benchmarks` =
18501850
"-Xlint:unchecked"
18511851
),
18521852
Compile / compile := (Compile / compile)
1853+
.dependsOn(`runtime-fat-jar` / assembly)
18531854
.dependsOn(Def.task { (Compile / sourceManaged).value.mkdirs })
18541855
.value,
18551856
parallelExecution := false,

build/build/src/engine/context.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -453,7 +453,7 @@ impl RunContext {
453453
// TODO [mwu] It should be possible to run them through context config option.
454454
if self.config.build_benchmarks {
455455
tasks.extend([
456-
"runtime/Benchmark/compile",
456+
"runtime-benchmarks/compile",
457457
"language-server/Benchmark/compile",
458458
"searcher/Benchmark/compile",
459459
"std-benchmarks/Benchmark/compile",

engine/runtime-benchmarks/src/main/java/org/enso/compiler/benchmarks/Utils.java

+4
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import java.io.IOException;
99
import java.nio.file.Files;
1010
import java.nio.file.Path;
11+
import java.nio.file.Paths;
1112
import java.util.logging.Level;
1213
import org.enso.interpreter.runtime.EnsoContext;
1314
import org.enso.polyglot.LanguageInfo;
@@ -21,6 +22,9 @@ public class Utils {
2122
public static Context.Builder createDefaultContextBuilder() {
2223
return Context.newBuilder()
2324
.allowExperimentalOptions(true)
25+
.option(
26+
RuntimeOptions.LANGUAGE_HOME_OVERRIDE,
27+
Paths.get("../../distribution/component").toFile().getAbsolutePath())
2428
.option(RuntimeOptions.LOG_LEVEL, Level.WARNING.getName())
2529
.option(RuntimeOptions.DISABLE_IR_CACHES, "true")
2630
.option(RuntimeOptions.STRICT_ERRORS, "true")

engine/runtime-benchmarks/src/main/java/org/enso/compiler/benchmarks/module/ImportStandardLibrariesBenchmark.java

-4
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import java.io.ByteArrayOutputStream;
44
import java.io.IOException;
55
import java.io.OutputStream;
6-
import java.nio.file.Paths;
76
import java.util.List;
87
import java.util.Set;
98
import java.util.concurrent.TimeUnit;
@@ -93,9 +92,6 @@ public void setup(BenchmarkParams params) throws IOException {
9392
this.out = new ByteArrayOutputStream();
9493
this.context =
9594
Utils.createDefaultContextBuilder()
96-
.option(
97-
RuntimeOptions.LANGUAGE_HOME_OVERRIDE,
98-
Paths.get("../../distribution/component").toFile().getAbsolutePath())
9995
// Enable IR caches - we don't want to compile the imported modules from the standard
10096
// libraries
10197
.option(RuntimeOptions.DISABLE_IR_CACHES, "false")

engine/runtime-benchmarks/src/main/java/org/enso/interpreter/bench/benchmarks/semantic/IfVsCaseBenchmarks.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@
2525

2626
@BenchmarkMode(Mode.AverageTime)
2727
@Fork(1)
28-
@Warmup(iterations = 5, time = 1)
29-
@Measurement(iterations = 3, time = 3)
28+
@Warmup(iterations = 5)
29+
@Measurement(iterations = 3)
3030
@OutputTimeUnit(TimeUnit.MILLISECONDS)
3131
@State(Scope.Benchmark)
3232
public class IfVsCaseBenchmarks {

lib/java/benchmarks-common/src/main/java/org/enso/interpreter/bench/BenchmarksRunner.java

+20-33
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,9 @@
33
import jakarta.xml.bind.JAXBException;
44
import java.io.File;
55
import java.io.IOException;
6-
import java.util.ArrayList;
76
import java.util.Collection;
87
import java.util.List;
9-
import java.util.stream.Collectors;
108
import org.openjdk.jmh.results.RunResult;
11-
import org.openjdk.jmh.runner.BenchmarkList;
12-
import org.openjdk.jmh.runner.BenchmarkListEntry;
139
import org.openjdk.jmh.runner.Runner;
1410
import org.openjdk.jmh.runner.RunnerException;
1511
import org.openjdk.jmh.runner.options.CommandLineOptionException;
@@ -21,15 +17,6 @@
2117
public class BenchmarksRunner {
2218
public static final File REPORT_FILE = new File("./bench-report.xml");
2319

24-
/**
25-
* @return A list of qualified names of all benchmarks visible to JMH.
26-
*/
27-
public List<String> getAvailable() {
28-
return BenchmarkList.defaultList().getAll(null, new ArrayList<>()).stream()
29-
.map(BenchmarkListEntry::getUsername)
30-
.collect(Collectors.toList());
31-
}
32-
3320
public static void run(String[] args) throws RunnerException {
3421
CommandLineOptions cmdOpts = null;
3522
try {
@@ -75,35 +62,35 @@ public static void run(String[] args) throws RunnerException {
7562
}
7663
}
7764

78-
private static Collection<RunResult> runCompileOnly(List<String> includes)
79-
throws RunnerException {
80-
System.out.println("Running benchmarks " + includes + " in compileOnly mode");
65+
/**
66+
* Results from compileOnly mode are not reported. Moreover, if some of the benchmarks in this
67+
* mode fails, the whole process immediately fails. This behavior is different to *normal*
68+
* benchmarks, where a single failure does not stop the whole process.
69+
*/
70+
private static void runCompileOnly(List<String> includes) {
71+
if (includes.isEmpty()) {
72+
System.out.println("Running all benchmarks in compileOnly mode");
73+
} else {
74+
System.out.println("Running benchmarks " + includes + " in compileOnly mode");
75+
}
8176
var optsBuilder =
8277
new OptionsBuilder()
8378
.measurementTime(TimeValue.seconds(1))
8479
.measurementIterations(1)
8580
.warmupIterations(0)
81+
.shouldFailOnError(true)
8682
.forks(0);
8783
includes.forEach(optsBuilder::include);
8884
var opts = optsBuilder.build();
8985
var runner = new Runner(opts);
90-
return runner.run();
91-
}
92-
93-
public static BenchmarkItem runSingle(String label) throws RunnerException, JAXBException {
94-
String includeRegex = "^" + label + "$";
95-
if (Boolean.getBoolean("bench.compileOnly")) {
96-
var results = runCompileOnly(List.of(includeRegex));
97-
var firstResult = results.iterator().next();
98-
return reportResult(label, firstResult);
99-
} else {
100-
var opts =
101-
new OptionsBuilder()
102-
.jvmArgsAppend("-Xss16M", "-Dpolyglot.engine.MultiTier=false")
103-
.include(includeRegex)
104-
.build();
105-
RunResult benchmarksResult = new Runner(opts).runSingle();
106-
return reportResult(label, benchmarksResult);
86+
try {
87+
runner.run();
88+
System.out.println(
89+
"benchmarks run successfully in compileOnly mode. Results are not reported.");
90+
} catch (RunnerException e) {
91+
System.err.println("Benchmark run failed: " + e.getMessage());
92+
e.printStackTrace(System.err);
93+
System.exit(1);
10794
}
10895
}
10996

0 commit comments

Comments
 (0)