{"record":{"id":"af7d9432a7b091a9","repo":"apache/beam","slug":"missing-side-input-info-for-collection-v","errorCode":null,"errorMessage":"missing side input info for collection %v","messagePattern":"missing side input info for collection (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"sdks/go/pkg/beam/core/runtime/exec/translate.go","lineNumber":627,"sourceCode":"\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\treturn nil, errors.WithContextf(err, \"couldn't retreive coder for timer %v in DoFn %v, ID %v\", fam, dofn.Name(), n.PID)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tfamilyToSpec[fam] = newTimerFamilySpec(domain, timerCoder)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tn.TimerTracker = newUserTimerAdapter(sID, familyToSpec)\n\t\t\t\t\t}\n\n\t\t\t\t\tfor i := 1; i < len(input); i++ {\n\t\t\t\t\t\t// TODO(https://github.com/apache/beam/issues/18602) Handle ViewFns for side inputs\n\n\t\t\t\t\t\tec, wc, err := b.makeCoderForPCollection(input[i])\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsidePB, ok := sides[indexToInputId(i)]\n\t\t\t\t\t\tif !ok {\n\t\t\t\t\t\t\treturn nil, fmt.Errorf(\"missing side input info for collection %v\", input[i])\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmapper, err := unmarshalAndMakeWindowMapping(sidePB.GetWindowMappingFn())\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsid := StreamID{\n\t\t\t\t\t\t\tPort:         Port{URL: b.desc.GetStateApiServiceDescriptor().GetUrl()},\n\t\t\t\t\t\t\tPtransformID: id.to,\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsideInputID := fmt.Sprintf(\"i%v\", i) // SideInputID (= local id, \"iN\")\n\t\t\t\t\t\tside := NewSideInputAdapter(sid, sideInputID, coder.NewW(ec, wc), mapper)\n\t\t\t\t\t\tn.Side = append(n.Side, side)\n\t\t\t\t\t}\n\t\t\t\t\tu = n\n\t\t\t\t\tif urn == urnProcessSizedElementsAndRestrictions {\n\t\t\t\t\t\toutputs := make([]string, len(transform.GetOutputs()))","sourceCodeStart":609,"sourceCodeEnd":645,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/go/pkg/beam/core/runtime/exec/translate.go#L609-L645","documentation":"makeLink wires up the inputs of a transform during pipeline translation. When an input edge is expected to be a side input, the translation looks up its side-input descriptor (window mapping etc.) in the collected side info; if absent for the given input PCollection, translation fails naming the collection. This means the pipeline proto lacks side-input metadata for an input the consumer treats as a side input.","triggerScenarios":"Translating a pipeline where a ParDo declares an input index as a side input, but the corresponding SideInput proto is missing from the transform's spec (indexToInputId lookup misses).","commonSituations":"Pipelines produced/modified by other SDKs or tools that dropped side-input metadata; version skew between job-submission and runner; hand-built pipeline protos in tests; custom translators reordering inputs.","solutions":["Rebuild the pipeline with the same Beam SDK version for construction and execution so side-input info is serialized.","Inspect the pipeline proto: ensure each side-input input index has a matching entry in the transform's side inputs map.","Check custom translators don't reorder/drop inputs so that indexToInputId mapping breaks.","If hand-crafting protos (tests), populate the side input spec for every side-input PCollection."],"exampleFix":"// before: side input declared in DoFn but not in payload\nsidePB, ok := sides[indexToInputId(i)]\n// after (pipeline construction): ensure the input is registered as a side input\nbeam.ParDo(s, fn, main, beam.SideInput{Input: sidePCol}) // not a plain input arg","handlingStrategy":"validation","validationCode":"if _, ok := sides[indexToInputId(i)]; !ok { return fmt.Errorf(\"input %d (%v) lacks side input info\", i, input[i]) }","typeGuard":null,"tryCatchPattern":"if err != nil && strings.Contains(err.Error(), \"missing side input info\") {\n    return nil, fmt.Errorf(\"pipeline proto corrupt or version-skewed: %w\", err)\n}","preventionTips":["Use the same Beam SDK version to build and execute the pipeline","Register side inputs with beam.SideInput rather than plain inputs","Don't reorder transform inputs in custom translators"],"tags":["beam-go","translation","side-input","pipeline-proto"],"backgroundTag":"missing-required-config-field","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"}