apache/beam · error

Invalid output type in method %v, return value at index %v (

Error message

Invalid output type in method %v, return value at index %v (type: %v). Output of method %v must implement sdf.RTracker.

What it means

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.

Source

Thrown at sdks/go/pkg/beam/core/graph/fn.go:1061

			}
			if method.Ret[0].T != reflectx.Float64 {
				err := errors.Errorf("invalid output type in method %v, return %v. got: %v, want: %v",
					restrictionSizeName, 0, method.Ret[0].T, reflectx.Float64)
				return errors.SetTopLevelMsgf(err, "Invalid output type in method %v, "+
					"return value at index %v. Got: %v, Want: %v. Sizing information in SDF methods must be in float64.",
					restrictionSizeName, 0, method.Ret[0].T, reflectx.Float64)
			}
		case createTrackerName:
			if method.Param[startIdx].T != restrictionT {
				err := errors.Errorf("mismatched restriction type in method %v, param %v. got: %v, want: %v",
					createTrackerName, startIdx, method.Param[startIdx].T, restrictionT)
				return errors.SetTopLevelMsgf(err, "Mismatched restriction type in method %v, "+
					"parameter at index %v. Got: %v, Want: %v (from method %v). "+
					"Ensure that all restrictions in an SDF are the same type.",
					createTrackerName, startIdx, method.Param[startIdx].T, restrictionT, createInitialRestrictionName)
			}
			if !method.Ret[0].T.Implements(rTrackerT) {
				err := errors.Errorf("invalid output type in method %v, return %v: %v does not implement sdf.RTracker",
					createTrackerName, 0, method.Ret[0].T)
				return errors.SetTopLevelMsgf(err, "Invalid output type in method %v, "+
					"return value at index %v (type: %v). Output of method %v must implement sdf.RTracker.",
					createTrackerName, 0, method.Ret[0].T, createTrackerName)
			}
			processFn := fn.methods[processElementName]
			pos, _ := processFn.RTracker()
			if method.Ret[0].T != processFn.Param[pos].T {
				err := errors.Errorf("mismatched output type in method %v, return %v: got: %v, want: %v",
					createTrackerName, 0, method.Ret[0].T, processFn.Param[pos].T)
				return errors.SetTopLevelMsgf(err, "Mismatched output type in method %v, "+
					"return value at index %v. Got: %v, Want: %v (from method %v).",
					createTrackerName, 0, method.Ret[0].T, processFn.Param[pos].T, processElementName)
			}
		}
	}

	rTrackerImplT := fn.methods[createTrackerName].Ret[0].T

View on GitHub (pinned to 12126d8942)

Solutions

  1. Return a type that implements sdf.RTracker, e.g. wrap your restriction with sdf.NewRestrictionTracker or a LockRTracker.
  2. Fix method signatures (TryClaim/TrySplit/etc.) so your custom tracker truly satisfies sdf.RTracker.
  3. Match receiver types: if RTracker methods are defined on *T, return *T.
  4. Use a compile-time assertion var _ sdf.RTracker = (*myTracker)(nil) to catch this before runtime.

Example fix

// before
func (fn *myFn) CreateTracker(r myRestriction) myRestriction { return r }

// after
func (fn *myFn) CreateTracker(r myRestriction) *sdf.LockRTracker {
    return sdf.NewLockRTracker(sdf.NewSliceRestrictionTracker(0, len(r.List)))
}
Defensive patterns

Strategy: type-guard

Validate before calling

// Compile-time assertion that the tracker satisfies sdf.RTracker:
var _ sdf.RTracker = (*myTracker)(nil)

Type guard

func implementsRTracker(rt any) bool { _, ok := rt.(sdf.RTracker); return ok }

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Understand the failure class

Background: Type mismatch errors: IllegalArgumentException, TypeError and type guards across 150 open-source libraries — this error's family across 150 libraries.

Related errors


AI-assisted analysis of apache/beam@12126d8942 (2026-09-13). Data as JSON: /api/errors/8adf71f76b6575f2. Report an issue: GitHub.