{"record":{"id":"d9f0ea545d4384d9","repo":"apache/beam","slug":"internal-error-determining-boundedness-of-read","errorCode":null,"errorMessage":"Internal error determining boundedness of Read","messagePattern":"Internal error determining boundedness of Read","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"sdks/java/core/src/main/java/org/apache/beam/sdk/util/construction/ReadTranslation.java","lineNumber":142,"sourceCode":"\n  public static UnboundedSource<?, ?> unboundedSourceFromProto(ReadPayload payload) {\n    checkArgument(payload.getIsBounded().equals(IsBounded.Enum.UNBOUNDED));\n    return (UnboundedSource<?, ?>)\n        SerializableUtils.deserializeFromByteArray(\n            payload.getSource().getPayload().toByteArray(), \"UnboundedSource\");\n  }\n\n  public static PCollection.IsBounded sourceIsBounded(AppliedPTransform<?, ?, ?> transform) {\n    try {\n      SdkComponents components = SdkComponents.create(transform.getPipeline().getOptions());\n      return PCollectionTranslation.fromProto(\n          ReadPayload.parseFrom(\n                  PTransformTranslation.toProto(transform, Collections.emptyList(), components)\n                      .getSpec()\n                      .getPayload())\n              .getIsBounded());\n    } catch (IOException e) {\n      throw new RuntimeException(\"Internal error determining boundedness of Read\", e);\n    }\n  }\n\n  /**\n   * A {@link PTransformTranslation.TransformPayloadTranslator} for {@link\n   * SplittableParDo.PrimitiveUnboundedRead}.\n   */\n  public static class UnboundedReadPayloadTranslator\n      implements PTransformTranslation.TransformPayloadTranslator<\n          SplittableParDo.PrimitiveUnboundedRead<?>> {\n    public static PTransformTranslation.TransformPayloadTranslator create() {\n      return new UnboundedReadPayloadTranslator();\n    }\n\n    private UnboundedReadPayloadTranslator() {}\n\n    @Override\n    public String getUrn() {","sourceCodeStart":124,"sourceCodeEnd":160,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/java/core/src/main/java/org/apache/beam/sdk/util/construction/ReadTranslation.java#L124-L160","documentation":"ReadTranslation.sourceIsBounded() determines whether a Read transform's source is bounded by round-tripping the transform to its proto form (PTransformTranslation.toProto), parsing the payload back with ReadPayload.parseFrom, and reading isBounded. Any IOException during this serialize/parse round trip is wrapped in a RuntimeException labeled 'Internal error determining boundedness of Read'. By design this path should never fail for a well-formed Read transform, so it signals an internal invariant violation.","triggerScenarios":"Calling ReadTranslation.sourceIsBounded(transform, components) where PTransformTranslation.toProto(...) or ReadPayload.parseFrom(...) throws IOException — typically a Read transform whose spec payload is missing, corrupted, or not a ReadPayload (e.g. a custom/overridden Read-like transform registered incorrectly).","commonSituations":"Custom PTransform payload translators interfering with Read translation, corrupted or hand-built pipeline protos, or version skew between SDK components producing an unexpected transform spec payload.","solutions":["Inspect the wrapped IOException cause to see which stage (toProto vs parseFrom) failed.","Verify the PTransform is a genuine Read transform with a valid ReadPayload spec.","Remove or fix custom TransformPayloadTranslator registrations that override Read translation.","Ensure all Beam SDK/runner modules use the same version to avoid proto schema skew."],"exampleFix":"// before\nboolean bounded = ReadTranslation.sourceIsBounded(readTransform, components);\n// after\ntry {\n  boolean bounded = ReadTranslation.sourceIsBounded(readTransform, components);\n} catch (RuntimeException e) {\n  throw new IllegalStateException(\"Transform is not a translatable Read: \" + readTransform.getKindString(), e);\n}","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try { boolean b = ReadTranslation.sourceIsBounded(t, components); } catch (RuntimeException e) { throw new IllegalStateException(\"Not a translatable Read transform\", e); }","preventionTips":["Only pass genuine Read transforms to sourceIsBounded","Keep all Beam modules on one version","Avoid overriding Read's payload translator"],"tags":["java","beam","internal","protobuf","read-transform"],"backgroundTag":"internal-invariant-violation","analyzedSha":"12126d8942aaf848030c478b4c6a28c6af861c66","analyzedAt":"2026-09-13T01:50:10.254Z","contentChangedAt":"2026-09-13T01:50:10.254Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}