{"record":{"id":"a4dc3832ef19c121","repo":"apache/beam","slug":"cannot-outputwindowedvalue-from-truncaterestriction","errorCode":null,"errorMessage":"Cannot outputWindowedValue from TruncateRestriction","messagePattern":"Cannot outputWindowedValue from TruncateRestriction","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"sdks/java/harness/src/main/java/org/apache/beam/fn/harness/SplittableTruncateSizedRestrictionsDoFnRunner.java","lineNumber":935,"sourceCode":"\n    @Override\n    public PipelineOptions pipelineOptions() {\n      return pipelineOptions;\n    }\n\n    @Override\n    public void outputWithTimestamp(RestrictionT output, Instant timestamp) {\n      throw new UnsupportedOperationException(\n          \"Cannot outputWithTimestamp from TruncateRestriction\");\n    }\n\n    @Override\n    public void outputWindowedValue(\n        RestrictionT output,\n        Instant timestamp,\n        Collection<? extends BoundedWindow> windows,\n        PaneInfo paneInfo) {\n      throw new UnsupportedOperationException(\n          \"Cannot outputWindowedValue from TruncateRestriction\");\n    }\n  }\n\n  /**\n   * Passes split requests downstream, by way of trySplit on the overall runner, which will split\n   * per window if needed.\n   */\n  private static class SplitDelegatingFnDataReceiver<\n          InputT, RestrictionT extends @NonNull Object, WatermarkEstimatorStateT>\n      implements FnDataReceiver<\n              WindowedValue<KV<KV<InputT, KV<RestrictionT, WatermarkEstimatorStateT>>, Double>>>,\n          HandlesSplits {\n\n    private final HandlesSplits splitDelegate;\n    private final SplittableTruncateSizedRestrictionsDoFnRunner<\n            InputT, RestrictionT, ?, WatermarkEstimatorStateT, ?>\n        runner;","sourceCodeStart":917,"sourceCodeEnd":953,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/SplittableTruncateSizedRestrictionsDoFnRunner.java#L917-L953","documentation":"Same contract as the timestamp variant: the OutputReceiver handed to @TruncateRestriction cannot emit windowed values at all. outputWindowedValue throws UnsupportedOperationException because truncation may only yield restrictions, never elements.","triggerScenarios":"Calling outputWindowedValue(...) (with windows/pane args) on the receiver available inside a @TruncateRestriction method.","commonSituations":"Trying to emit to multiple windows or with a custom pane during truncation; porting code that used a full OutputReceiver/WindowedOutputReceiver into truncateRestriction.","solutions":["Remove the outputWindowedValue call from @TruncateRestriction.","Restrict all element/windowed output to @ProcessElement.","Use a WindowedOutputReceiver only where the runner supplies one (processElement context)."],"exampleFix":"// before\n@TruncateRestriction void truncate(Restriction r, WindowedOutputReceiver<Restriction> out) { out.outputWindowedValue(r, now, windows, pane); }\n// after\n@TruncateRestriction void truncate(Restriction r, OutputReceiver<Restriction> out) { /* no element output */ }","handlingStrategy":"type-guard","validationCode":null,"typeGuard":"boolean isTruncateReceiver = receiver instanceof SplittableTruncateSizedRestrictionsDoFnRunner.TruncateRestrictionReceiver; // no windowed output if true","tryCatchPattern":"try { out.outputWindowedValue(r, ts, windows, pane); } catch (UnsupportedOperationException e) { LOG.error(\"Windowed output unsupported in truncateRestriction\"); }","preventionTips":["Keep @TruncateRestriction free of element/windowed output","Use restriction output only","Consult the Splittable DoFn lifecycle docs"],"tags":["apache-beam","splittable-dofn","unsupported-operation"],"backgroundTag":"unsupported-operation","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"}