{"record":{"id":"58b007cca6d904e9","repo":"oracle/graal","slug":"suite-runs-only-a-single-benchmark-got-benchmar","errorCode":null,"errorMessage":"Suite runs only a single benchmark, got: {benchmarks}","messagePattern":"Suite runs only a single benchmark, got: (.+?)","errorType":"exception","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"sdk/mx.sdk/mx_sdk_benchmark.py","lineNumber":2640,"sourceCode":"    def dataLocation(self):\n        if self.version() == \"23.11-MR2-chopin\":\n            basePath = self.daCapoPath()\n            subdir = \"dacapo-23.11-MR2-chopin\"\n            if self.minimalArchive():\n                subdir += \"-minimal\"\n            return os.path.join(basePath, subdir)\n        else:\n            raise RuntimeError(f\"data location is not supported for suite version '{self.version()}'\")\n\n    def minimalArchive(self):\n        return False\n\n    def createCommandLineArgs(self, benchmarks, bmSuiteArgs):\n        if benchmarks is None:\n            raise RuntimeError(\n                \"Suite runs only a single benchmark.\")\n        if len(benchmarks) != 1:\n            raise RuntimeError(\n                f\"Suite runs only a single benchmark, got: {benchmarks}\")\n\n        benchmark = benchmarks[0]\n        runArgs = self.postprocessRunArgs(benchmark, self.runArgs(bmSuiteArgs))\n        if runArgs is None:\n            return None\n\n        jarPath = self.jarPath(benchmark)\n        return self.vmArgs(bmSuiteArgs) + [\"-jar\"] + [jarPath, benchmark] + runArgs\n\n    def benchmarkList(self, bmSuiteArgs):\n        missing_sizes = set(self.daCapoIterations().keys()).difference(set(self.daCapoSizes().keys()))\n        if len(missing_sizes) > 0:\n            mx.abort(f\"Missing size definitions for benchmark(s): {missing_sizes}\")\n        return [b for b, it in self.daCapoIterations().items()\n                if self.workloadSize() in self.daCapoSizes().get(b, []) and it != -1]\n\n    def successPatterns(self):","sourceCodeStart":2622,"sourceCodeEnd":2658,"githubUrl":"https://github.com/oracle/graal/blob/a66e9ccd1d7bf2552883939aa0788dfd0e294aab/sdk/mx.sdk/mx_sdk_benchmark.py#L2622-L2658","documentation":"Same single-benchmark constraint as error 803, but raised when more than one benchmark was supplied. DaCapo runs one benchmark per JVM invocation, so a list like ['fop','lusearch'] cannot be turned into one command line.","triggerScenarios":"Passing multiple benchmarks to the DaCapo suite, e.g. 'mx benchmark dacapo-chopin:fop,lusearch' or a script that forwards a benchmark list.","commonSituations":"Users used to suites that accept comma-separated benchmark lists; harnesses that aggregate several benchmarks into one mx call.","solutions":["Split into one mx benchmark invocation per benchmark.","Use mx's bench-suite-level repetition ('--repeat' or the benchmark runner's loop) rather than bundling benchmarks into one call.","Check for trailing commas or empty entries in the selector that may parse as two benchmarks."],"exampleFix":"# before\nmx benchmark dacapo-chopin:fop,lusearch\n\n# after\nmx benchmark dacapo-chopin:fop && mx benchmark dacapo-chopin:lusearch","handlingStrategy":"validation","validationCode":"assert len(benchmarks) == 1, (\n    f\"DaCapo runs one benchmark per JVM: got {benchmarks}; \"\n    \"split into separate invocations.\")","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Loop over benchmarks one mx invocation at a time instead of passing lists.","Reject multi-value selectors early in wrapper scripts."],"tags":["graalvm","benchmark","dacapo","usage","mx"],"backgroundTag":null,"analyzedSha":"a66e9ccd1d7bf2552883939aa0788dfd0e294aab","analyzedAt":"2026-08-14T13:58:47.161Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}