{"record":{"id":"4db67598122ea09c","repo":"apache/beam","slug":"unsupported-windowcoder-type-v","errorCode":null,"errorMessage":"unsupported WindowCoder Type: %v","messagePattern":"unsupported WindowCoder Type: (.+?)","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"sdks/go/pkg/beam/runners/prism/internal/engine/timers.go","lineNumber":71,"sourceCode":"\tcase WinGlobal:\n\t\tsingleWindowExtractor = func(*decoder) typex.Window {\n\t\t\treturn window.GlobalWindow{}\n\t\t}\n\tcase WinInterval:\n\t\tsingleWindowExtractor = func(d *decoder) typex.Window {\n\t\t\treturn d.IntervalWindow()\n\t\t}\n\tcase WinCustom:\n\t\t// Default to a length prefixed window coder here until we have different information.\n\t\t// Everything else is either:: variable, 1,  4, or 8 bytes long\n\t\t// KVs (especially nested ones, could occur but are unlikely, and it would be\n\t\t// easier for Prism to force such coders to be length prefixed.\n\t\tsingleWindowExtractor = func(d *decoder) typex.Window {\n\t\t\treturn d.CustomWindowLengthPrefixed()\n\t\t}\n\tdefault:\n\t\t// Unsupported\n\t\tpanic(fmt.Sprintf(\"unsupported WindowCoder Type: %v\", winCoder))\n\t}\n\n\treturn func(yield func(timerRet) bool) {\n\t\tfor len(raw) > 0 {\n\t\t\tkeyBytes := keyDec(bytes.NewBuffer(raw))\n\t\t\td := decoder{raw: raw, cursor: len(keyBytes)}\n\t\t\ttag := string(d.Bytes())\n\n\t\t\tvar ws []typex.Window\n\t\t\tnumWin := d.Fixed32()\n\t\t\tfor i := 0; i < int(numWin); i++ {\n\t\t\t\tws = append(ws, singleWindowExtractor(&d))\n\t\t\t}\n\n\t\t\tclear := d.Bool()\n\t\t\thold := mtime.MaxTimestamp\n\t\t\tif clear {\n\t\t\t\tvar elms []element","sourceCodeStart":53,"sourceCodeEnd":89,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/go/pkg/beam/runners/prism/internal/engine/timers.go#L53-L89","documentation":"When decoding timers, Prism inspects the timer's window coder and builds a window extractor for the supported coder types. If the WindowCoder's type is not one of the recognized kinds (global, interval, custom length-prefixed, etc.), the runner panics because it cannot know how to delimit or decode windows in timer payloads.","triggerScenarios":"decodeTimerIter (invoked from triageTimers) encountering a timer whose window coder type is unrecognized by the switch — e.g. a new/exotic WindowCoder type from an SDK that prism hasn't implemented, or a coder mismatch.","commonSituations":"Cross-language pipelines (e.g. Python/Java SDK emitting a window coder prism's Go decoder doesn't know), custom windowing strategies, or Beam version skew where the SDK supports a coder the runner does not.","solutions":["Use standard windowing (fixed/interval or global windows) in the timers' stage","Upgrade prism/Beam so the window coder type is supported on both sides","Ensure SDK harness and runner versions match to avoid coder type skew","If a legitimate coder type is missing, report it to the Beam project with the coder bytes"],"exampleFix":"// before: custom window coder in a timers-using stage\nw := window.NewCustomWindows(...)\n// after: use a supported windowing strategy\nw := window.NewFixedWindows(duration)","handlingStrategy":"type-guard","validationCode":"switch winCoder.(type) {\ncase window.GlobalWindowCoder, window.IntervalWindowCoder:\n    // supported\ndefault:\n    return fmt.Errorf(\"window coder %T unsupported for timers\", winCoder)\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Use global or interval window coders for stages that set timers","Match SDK and runner versions to keep coder catalogs aligned","Avoid custom windowing in cross-language pipelines using timers"],"tags":["go","beam","prism","timers","window","coder"],"backgroundTag":"unsupported-enum-value","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"}