{"record":{"id":"02f98b8095977001","repo":"apache/beam","slug":"createtracker-has-unexpected-number-of-return-values-v-sdf","errorCode":null,"errorMessage":"CreateTracker has unexpected number of return values: %v","messagePattern":"CreateTracker has unexpected number of return values: (.+?)","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"sdks/go/pkg/beam/core/runtime/exec/sdf_invokers_arity.tmpl","lineNumber":197,"sourceCode":"\t{{end}}\n{{end}}\n{{end}}\n\tdefault:\n\t\tif len(n.fn.Param) < 1 || len(n.fn.Param) > 2 {\n\t\t\treturn errors.Errorf(\"CreateTracker has unexpected number of parameters: %v\", len(n.fn.Param))\n\t\t}\n\n\t\tn.call = func() (rt sdf.RTracker, err error) {\n\t\t\tret := n.fn.Fn.Call(n.args)\n\n\t\t\tswitch len(ret) {\n\t\t\tcase 1:\n\t\t\t\treturn ret[0].(sdf.RTracker), nil\n\t\t\tcase 2:\n\t\t\t\treturn ret[0].(sdf.RTracker), asError(ret[1])\n\t\t\t}\n\n\t\t\tpanic(fmt.Sprintf(\"CreateTracker has unexpected number of return values: %v\", len(ret)))\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (n *trInvoker) initCallFn() error {\n\t// Expects a signature of the form:\n\t// (context.Context?, sdf.RTracker, key?, value) (restriction, error?)\n\t// TODO(BEAM-9643): Link to full documentation.\n\tswitch fnT := n.fn.Fn.(type) {\n{{range $out := upto 3}}\n{{range $in := upto 5}}\n    {{if gt $out 0}}\n    {{if gt $in 1}}\n\tcase reflectx.Func{{$in}}x{{$out}}:\n\t\tn.call = func() (rest any, err error) {\n\t\t\t{{mktuplef $out \"r%v\"}} := fnT.Call{{$in}}x{{$out}}({{mktuplef $in \"n.args[%v]\"}})","sourceCodeStart":179,"sourceCodeEnd":215,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/go/pkg/beam/core/runtime/exec/sdf_invokers_arity.tmpl#L179-L215","documentation":"The SDF invoker requires CreateTracker to return either 1 value (an sdf.RTracker) or 2 values (RTracker + error). Other return counts cannot be dispatched and panic. Additionally the first return value must implement sdf.RTracker, since the generated code type-asserts it.","triggerScenarios":"A splittable DoFn whose CreateTracker returns 0 or 3+ values, or whose first return does not implement sdf.RTracker, executed in a pipeline.","commonSituations":"Returning a custom restriction tracker type that doesn't implement the sdf.RTracker interface; wrong return arity from refactoring.","solutions":["Make CreateTracker return exactly (sdf.RTracker) or (sdf.RTracker, error)","Ensure the returned type implements sdf.RTracker (TryClaim, TrySplit, GetProgress, IsDone, etc.)","Compare against the Beam Go SDF examples to confirm the full method set"],"exampleFix":"// before\nfunc (fn *sdfFn) CreateTracker(r Rest) (MyTracker, bool) { ... }\n\n// after\nfunc (fn *sdfFn) CreateTracker(r Rest) (sdf.RTracker, error) {\n    return &myTracker{r: r}, nil\n}","handlingStrategy":"validation","validationCode":"m := reflect.ValueOf(fn).MethodByName(\"CreateTracker\")\nif m.IsValid() {\n    t := m.Type()\n    if (t.NumOut() != 1 && t.NumOut() != 2) || !t.Out(0).Implements(reflect.TypeOf((*sdf.RTracker)(nil)).Elem()) {\n        return fmt.Errorf(\"CreateTracker must return sdf.RTracker (plus optional error)\")\n    }\n}","typeGuard":"func validCreateTracker(fn interface{}) bool {\n    m := reflect.ValueOf(fn).MethodByName(\"CreateTracker\")\n    if !m.IsValid() { return false }\n    t := m.Type()\n    rt := reflect.TypeOf((*sdf.RTracker)(nil)).Elem()\n    return (t.NumOut() == 1 || t.NumOut() == 2) && t.Out(0).Implements(rt)\n}","tryCatchPattern":"defer func() {\n    if r := recover(); strings.Contains(fmt.Sprint(r), \"CreateTracker has unexpected number of return values\") {\n        log.Fatalf(\"SDF signature error: %v\", r)\n    }\n}()","preventionTips":["Return a type that fully implements sdf.RTracker","Use (sdf.RTracker, error) or (sdf.RTracker) as the signature","Compile-time check: var _ sdf.RTracker = (*myTracker)(nil)"],"tags":["go","apache-beam","sdf","arity","panic"],"backgroundTag":"invalid-argument-value","analyzedSha":"12126d8942aaf848030c478b4c6a28c6af861c66","analyzedAt":"2026-09-13T01:50:10.254Z","contentChangedAt":"2026-09-13T01:50:10.254Z","schemaVersion":2},"datasetVersion":"2026-09-14T21:17:11.552Z"}