{"record":{"id":"d99b917f2be04db4","repo":"apache/beam","slug":"per-pipeline-options-not-supported","errorCode":null,"errorMessage":"Per-pipeline options not supported.","messagePattern":"Per-pipeline options not supported\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"sdks/typescript/src/apache_beam/testing/multi_pipeline_runner.ts","lineNumber":98,"sourceCode":"      this.setNextTestName(\"pipeline\");\n    }\n    this.usedTestNames.add(this.nextTestName!);\n    const p = new Pipeline(this.getPrefix());\n    await new Root(p).applyAsync(\n      withName(this.nextTestName!, async (root) => {\n        await pipeline(root);\n      }),\n    );\n    this.nextTestName = undefined;\n    return this.runPipeline(p.getProto());\n  }\n\n  async runPipeline(\n    pipeline: runnerApi.Pipeline,\n    options?: PipelineOptions,\n  ): Promise<PipelineResult> {\n    if (options) {\n      throw new Error(\"Per-pipeline options not supported.\");\n    }\n    this.mergePipeline(pipeline);\n    return new FakePipelineResult();\n  }\n\n  async reallyRunPipelines() {\n    if (this.allPipelines === undefined) {\n      return new FakePipelineResult();\n    }\n    console.log(this.allPipelines);\n    const pipelineResult = await this.underlying.runPipeline(\n      this.allPipelines,\n      this.options,\n    );\n    const finalState = await pipelineResult.waitUntilFinish();\n    if (finalState != jobApi.JobState_Enum.DONE) {\n      // TODO: Grab the last/most severe error message?\n      throw new Error(","sourceCodeStart":80,"sourceCodeEnd":116,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/typescript/src/apache_beam/testing/multi_pipeline_runner.ts#L80-L116","documentation":"MultiPipelineRunner batches multiple pipelines and applies a single global options set, so runPipeline() rejects any per-pipeline PipelineOptions argument with 'Per-pipeline options not supported.' It enforces that all pipelines in a multi-pipeline run share the same configuration.","triggerScenarios":"Calling runPipeline(pipeline, options) on a MultiPipelineRunner instance with a non-undefined options argument.","commonSituations":"Refactoring code that previously used the standard runner (which accepts per-pipeline options) to the multi-pipeline test runner, without removing the options parameter.","solutions":["Call runPipeline(pipeline) without the options argument and pass options when constructing the MultiPipelineRunner instead.","Set options once on the MultiPipelineRunner so they apply to all merged pipelines.","Remove per-pipeline customization if using the multi-pipeline test harness."],"exampleFix":"// before\nmultiRunner.runPipeline(pipeline, myOptions);\n// after\nmultiRunner.runPipeline(pipeline); // options supplied at MultiPipelineRunner construction","handlingStrategy":"validation","validationCode":"if (options !== undefined) {\n  throw new Error(\"MultiPipelineRunner: pass options to the constructor, not runPipeline\");\n}","typeGuard":"null","tryCatchPattern":"try {\n  await multiRunner.runPipeline(pipeline, options);\n} catch (e) {\n  if (e.message === \"Per-pipeline options not supported.\") {\n    console.error(\"Set options on the MultiPipelineRunner instead.\");\n  } else throw e;\n}","preventionTips":["Supply options once at MultiPipelineRunner construction","Never pass a second argument to runPipeline on the multi-pipeline runner","Do not mix standard-runner call signatures with the multi-pipeline harness"],"tags":["options","multi-pipeline","unsupported"],"backgroundTag":"unsupported-operation","analyzedSha":"12126d8942aaf848030c478b4c6a28c6af861c66","analyzedAt":"2026-09-13T01:50:10.254Z","contentChangedAt":"2026-09-13T01:50:10.254Z","schemaVersion":2},"datasetVersion":"2026-09-20T03:17:13.778Z"}