{"record":{"id":"8adf71f76b6575f2","repo":"apache/beam","slug":"invalid-output-type-in-method-v-return-value-at-index-v-type","errorCode":null,"errorMessage":"Invalid output type in method %v, return value at index %v (type: %v). Output of method %v must implement sdf.RTracker.","messagePattern":"Invalid output type in method (.+?), return value at index (.+?) \\(type: (.+?)\\)\\. Output of method (.+?) must implement sdf\\.RTracker\\.","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"sdks/go/pkg/beam/core/graph/fn.go","lineNumber":1061,"sourceCode":"\t\t\t}\n\t\t\tif method.Ret[0].T != reflectx.Float64 {\n\t\t\t\terr := errors.Errorf(\"invalid output type in method %v, return %v. got: %v, want: %v\",\n\t\t\t\t\trestrictionSizeName, 0, method.Ret[0].T, reflectx.Float64)\n\t\t\t\treturn errors.SetTopLevelMsgf(err, \"Invalid output type in method %v, \"+\n\t\t\t\t\t\"return value at index %v. Got: %v, Want: %v. Sizing information in SDF methods must be in float64.\",\n\t\t\t\t\trestrictionSizeName, 0, method.Ret[0].T, reflectx.Float64)\n\t\t\t}\n\t\tcase createTrackerName:\n\t\t\tif method.Param[startIdx].T != restrictionT {\n\t\t\t\terr := errors.Errorf(\"mismatched restriction type in method %v, param %v. got: %v, want: %v\",\n\t\t\t\t\tcreateTrackerName, startIdx, method.Param[startIdx].T, restrictionT)\n\t\t\t\treturn errors.SetTopLevelMsgf(err, \"Mismatched restriction type in method %v, \"+\n\t\t\t\t\t\"parameter at index %v. Got: %v, Want: %v (from method %v). \"+\n\t\t\t\t\t\"Ensure that all restrictions in an SDF are the same type.\",\n\t\t\t\t\tcreateTrackerName, startIdx, method.Param[startIdx].T, restrictionT, createInitialRestrictionName)\n\t\t\t}\n\t\t\tif !method.Ret[0].T.Implements(rTrackerT) {\n\t\t\t\terr := errors.Errorf(\"invalid output type in method %v, return %v: %v does not implement sdf.RTracker\",\n\t\t\t\t\tcreateTrackerName, 0, method.Ret[0].T)\n\t\t\t\treturn errors.SetTopLevelMsgf(err, \"Invalid output type in method %v, \"+\n\t\t\t\t\t\"return value at index %v (type: %v). Output of method %v must implement sdf.RTracker.\",\n\t\t\t\t\tcreateTrackerName, 0, method.Ret[0].T, createTrackerName)\n\t\t\t}\n\t\t\tprocessFn := fn.methods[processElementName]\n\t\t\tpos, _ := processFn.RTracker()\n\t\t\tif method.Ret[0].T != processFn.Param[pos].T {\n\t\t\t\terr := errors.Errorf(\"mismatched output type in method %v, return %v: got: %v, want: %v\",\n\t\t\t\t\tcreateTrackerName, 0, method.Ret[0].T, processFn.Param[pos].T)\n\t\t\t\treturn errors.SetTopLevelMsgf(err, \"Mismatched output type in method %v, \"+\n\t\t\t\t\t\"return value at index %v. Got: %v, Want: %v (from method %v).\",\n\t\t\t\t\tcreateTrackerName, 0, method.Ret[0].T, processFn.Param[pos].T, processElementName)\n\t\t\t}\n\t\t}\n\t}\n\n\trTrackerImplT := fn.methods[createTrackerName].Ret[0].T","sourceCodeStart":1043,"sourceCodeEnd":1079,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/go/pkg/beam/core/graph/fn.go#L1043-L1079","documentation":"CreateTracker must return a value whose type implements the sdf.RTracker interface. This error fires when the first return value's reflect type does not implement RTracker, so the framework cannot use it to track restriction progress during splitting and bundle processing.","triggerScenarios":"CreateTracker returning a custom struct that lacks RTracker methods (TryClaim, TrySplit, GetError, etc.), returning a pointer when methods are on the value receiver (or vice versa), or returning a plain restriction.","commonSituations":"Implementing a custom tracker with slightly wrong method signatures so it silently fails to satisfy the interface; forgetting to use beam's restriction trackers (e.g. sdf.LockRTracker); value/pointer receiver mismatches.","solutions":["Return a type that implements sdf.RTracker, e.g. wrap your restriction with sdf.NewRestrictionTracker or a LockRTracker.","Fix method signatures (TryClaim/TrySplit/etc.) so your custom tracker truly satisfies sdf.RTracker.","Match receiver types: if RTracker methods are defined on *T, return *T.","Use a compile-time assertion var _ sdf.RTracker = (*myTracker)(nil) to catch this before runtime."],"exampleFix":"// before\nfunc (fn *myFn) CreateTracker(r myRestriction) myRestriction { return r }\n\n// after\nfunc (fn *myFn) CreateTracker(r myRestriction) *sdf.LockRTracker {\n    return sdf.NewLockRTracker(sdf.NewSliceRestrictionTracker(0, len(r.List)))\n}","handlingStrategy":"type-guard","validationCode":"// Compile-time assertion that the tracker satisfies sdf.RTracker:\nvar _ sdf.RTracker = (*myTracker)(nil)","typeGuard":"func implementsRTracker(rt any) bool { _, ok := rt.(sdf.RTracker); return ok }","tryCatchPattern":null,"preventionTips":["Add var _ sdf.RTracker = (*myTracker)(nil) near the tracker definition","Prefer stock trackers (sdf.NewSliceRestrictionTracker, LockRTracker) over custom ones","Check receiver types (value vs pointer) when implementing RTracker methods"],"tags":["go","apache-beam","sdf","interface-not-implemented","rtracker"],"backgroundTag":"type-mismatch","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"}