{"record":{"id":"47ebd270d33c2808","repo":"apache/beam","slug":"createtracker-has-unexpected-number-of-return-values-v","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.go","lineNumber":267,"sourceCode":"\t\t\treturn r0.(sdf.RTracker), asError(r1)\n\t\t}\n\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\n\tcase reflectx.Func2x1:\n\t\tn.call = func() (rest any, err error) {\n\t\t\tr0 := fnT.Call2x1(n.args[0], n.args[1])\n\t\t\treturn r0, nil\n\t\t}\n","sourceCodeStart":249,"sourceCodeEnd":285,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/go/pkg/beam/core/runtime/exec/sdf_invokers_arity.go#L249-L285","documentation":"The reflection invoker for the SDF method CreateTracker expects the method to return an sdf.RTracker, optionally with an error. Any other arity (or a return value that is not an sdf.RTracker) makes the invoker panic, since it must produce a valid restriction tracker for splitting and progress tracking.","triggerScenarios":"CreateTracker returning a custom tracker type that does not implement sdf.RTracker; returning (tracker, extraValue); 0 or 3+ return values.","commonSituations":"Custom trackers that forgot to embed/implement all sdf.RTracker methods (NoRest, TryClaim, etc.); returning a pointer to a type only satisfying part of the interface; signature drift after refactor.","solutions":["Return exactly (sdf.RTracker) or (sdf.RTracker, error)","Ensure the returned concrete type fully implements sdf.RTracker (embed sdf.RTrackerBase if needed)","Check the returned value satisfies the interface with a compile-time assertion var _ sdf.RTracker = (*myTracker)(nil)","Test with the direct runner before deploying"],"exampleFix":"// before\nfunc (fn *MyDoFn) CreateTracker(r MyRestriction) *myTracker { return &myTracker{r} } // doesn't implement RTracker\n// after\nfunc (fn *MyDoFn) CreateTracker(r MyRestriction) (sdf.RTracker, error) {\n    return &myTracker{Restriction: r, RTrackerBase: sdf.RTrackerBase{}}, nil\n}","handlingStrategy":"validation","validationCode":"var _ sdf.RTracker = (*myTracker)(nil)\nt := reflect.TypeOf(fn.CreateTracker)\nif t.NumOut() != 1 && t.NumOut() != 2 {\n    panic(\"CreateTracker must return (sdf.RTracker) or (sdf.RTracker, error)\")\n}","typeGuard":"func returnsRTracker(m interface{}) bool {\n    t := reflect.TypeOf(m)\n    return t.NumOut() >= 1 && t.Out(0).Implements(reflect.TypeOf((*sdf.RTracker)(nil)).Elem())\n}","tryCatchPattern":null,"preventionTips":["Embed sdf.RTrackerBase in custom trackers","Add a compile-time assertion: var _ sdf.RTracker = (*myTracker)(nil)","Return exactly the tracker interface, not a concrete unexported type mismatch","Test tracker creation with the direct runner"],"tags":["go","apache-beam","splittable-dofn","interface"],"backgroundTag":"invalid-argument-format","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"}