{"record":{"id":"419b30bf4da2962a","repo":"apache/beam","slug":"invalid-combinepayload-payload-for-v","errorCode":null,"errorMessage":"invalid CombinePayload payload for %v","messagePattern":"invalid CombinePayload payload for (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"sdks/go/pkg/beam/core/runtime/exec/translate.go","lineNumber":490,"sourceCode":"\t\tvar userTimers map[string]*pipepb.TimerFamilySpec\n\t\tswitch urn {\n\t\tcase graphx.URNParDo,\n\t\t\turnPairWithRestriction,\n\t\t\turnSplitAndSizeRestrictions,\n\t\t\turnProcessSizedElementsAndRestrictions,\n\t\t\turnTruncateSizedRestrictions:\n\t\t\tvar pardo pipepb.ParDoPayload\n\t\t\tif err := proto.Unmarshal(payload, &pardo); err != nil {\n\t\t\t\treturn nil, errors.Wrapf(err, \"invalid ParDo payload for %v\", transform)\n\t\t\t}\n\t\t\tdata = string(pardo.GetDoFn().GetPayload())\n\t\t\tsides = pardo.GetSideInputs()\n\t\t\tuserState = pardo.GetStateSpecs()\n\t\t\tuserTimers = pardo.GetTimerFamilySpecs()\n\t\tcase urnPerKeyCombinePre, urnPerKeyCombineMerge, urnPerKeyCombineExtract, urnPerKeyCombineConvert:\n\t\t\tvar cmb pipepb.CombinePayload\n\t\t\tif err := proto.Unmarshal(payload, &cmb); err != nil {\n\t\t\t\treturn nil, errors.Wrapf(err, \"invalid CombinePayload payload for %v\", transform)\n\t\t\t}\n\t\t\tdata = string(cmb.GetCombineFn().GetPayload())\n\t\tdefault:\n\t\t\t// TODO(herohde) 12/4/2017: we see DoFns directly with Dataflow. Handle that\n\t\t\t// case here, for now, so that the harness can use this logic.\n\n\t\t\tdata = string(payload)\n\t\t}\n\n\t\t// TODO(herohde) 1/28/2018: Once Dataflow's fully off the old way,\n\t\t// we can simply switch on the ParDo DoFn URN directly.\n\n\t\tvar tp v1pb.TransformPayload\n\t\tif err := protox.DecodeBase64(data, &tp); err != nil {\n\t\t\treturn nil, errors.Wrapf(err, \"invalid transform payload for %v\", transform)\n\t\t}\n\n\t\tswitch tpUrn := tp.GetUrn(); tpUrn {","sourceCodeStart":472,"sourceCodeEnd":508,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/go/pkg/beam/core/runtime/exec/translate.go#L472-L508","documentation":"makeLink decodes pipepb.CombinePayload for per-key combine transforms (pre/merge/extract/convert URNs). A payload that fails proto.Unmarshal is wrapped as this error with the transform name, stopping plan translation.","triggerScenarios":"A combine transform (urnPerKeyCombinePre/Merge/Extract/Convert) whose spec payload isn't a valid serialized CombinePayload, encountered in makeLink.","commonSituations":"Manually assembled pipeline protos missing CombinePayload fields; cross-SDK/runner encoding mismatches for combine transforms; corrupted payloads.","solutions":["Ensure combine transforms serialize a proper pipepb.CombinePayload including the CombineFn","Construct combines via the beam.Combine API so payload encoding is done by the SDK","Verify the runner preserves payload bytes unchanged through the protocol"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"// Validate combine payload ahead of translation\nvar cmb pipepb.CombinePayload\nif err := proto.Unmarshal(payload, &cmb); err != nil {\n    return fmt.Errorf(\"bad CombinePayload: %w\", err)\n}","typeGuard":null,"tryCatchPattern":"if err := exec.UnmarshalPlan(desc); err != nil {\n    if strings.Contains(err.Error(), \"invalid CombinePayload payload\") {\n        return fmt.Errorf(\"combine transform graph malformed: %w\", err)\n    }\n    return err\n}","preventionTips":["Use beam.Combine APIs so CombinePayload encoding is SDK-managed","Verify payloads survive the runner round-trip unchanged"],"tags":["go","apache-beam","protobuf","combine"],"backgroundTag":"protobuf-unmarshal-failed","analyzedSha":"12126d8942aaf848030c478b4c6a28c6af861c66","analyzedAt":"2026-09-13T01:50:10.254Z","contentChangedAt":"2026-09-13T01:50:10.254Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}