{"record":{"id":"e6584c3960f86068","repo":"apache/beam","slug":"no-io-transform-feeds-s","errorCode":null,"errorMessage":"No IO transform feeds %s","messagePattern":"No IO transform feeds (.+?)","errorType":"exception","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"sdks/python/apache_beam/runners/portability/fn_api_runner/execution.py","lineNumber":1180,"sourceCode":"    for read_id, proto in self.process_bundle_descriptor.transforms.items():\n      # The GrpcRead is followed by the SDF/Process.\n      if (proto.spec.urn == bundle_processor.DATA_INPUT_URN and\n          input_pcoll in proto.outputs.values()):\n        return read_id\n      # The GrpcRead is followed by the SDF/Truncate -> SDF/Process.\n      if (proto.spec.urn\n          == common_urns.sdf_components.TRUNCATE_SIZED_RESTRICTION.urn and\n          input_pcoll in proto.outputs.values()):\n        read_input = list(\n            self.process_bundle_descriptor.transforms[read_id].inputs.values()\n        )[0]\n        for (grpc_read,\n             transform_proto) in self.process_bundle_descriptor.transforms.items():  # pylint: disable=line-too-long\n          if (transform_proto.spec.urn == bundle_processor.DATA_INPUT_URN and\n              read_input in transform_proto.outputs.values()):\n            return grpc_read\n\n    raise RuntimeError('No IO transform feeds %s' % transform_id)\n","sourceCodeStart":1162,"sourceCodeEnd":1181,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/python/apache_beam/runners/portability/fn_api_runner/execution.py#L1162-L1181","documentation":"input_for maps a transform's deferred input to the GRPC read (data channel) transform that feeds it by scanning the ProcessBundleDescriptor. If no DATA_INPUT_URN transform consumes that input, there is no channel wired for it and this RuntimeError is thrown.","triggerScenarios":"Residuals or SDK-delayed applications reference an input transform_id for which no matching data-input read exists in the bundle descriptor — e.g. after graph rewrites removed or renamed the channel.","commonSituations":"Split/residual processing after optimization stages altered the graph; cross-language pipelines where channel naming mismatches; runner-internal bugs in stage construction.","solutions":["Upgrade apache-beam to a version fixing stage/split graph wiring","Reproduce with --experiments=beam_fn_api_use_transform_for_resquad to alter residual handling","Inspect the ProcessBundleDescriptor to confirm the transform_id's outputs and data channels","File a Beam issue with the pipeline and stage dumps if reproducible"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try:\n    input_ref = ctx.input_for(transform_id)\nexcept RuntimeError as e:\n    if 'No IO transform feeds' in str(e):\n        rebuild_bundle_descriptor(ctx)\n    raise","preventionTips":["Keep runner at the latest patch release (split/residual wiring bugs are fixed over time)","Avoid custom graph rewrites that drop data channel reads","Dump ProcessBundleDescriptor when debugging split behavior"],"tags":["python","apache-beam","bundle-splitting","graph-wiring"],"backgroundTag":"resource-not-found","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"}