{"record":{"id":"b6b13f27d74f6791","repo":"pentaho/pentaho-kettle","slug":"unable-to-find-step-streamingsourcestepname-to-stream-data","errorCode":null,"errorMessage":"Unable to find step '{streamingSourceStepname}' to stream data from","messagePattern":"Unable to find step '(.+?)' to stream data from","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"plugins/meta-inject/impl/src/main/java/org/pentaho/di/trans/steps/metainject/MetaInject.java","lineNumber":191,"sourceCode":"        }\n        stepInterface.addRowListener( new RowAdapter() {\n          @Override\n          public void rowWrittenEvent( RowMetaInterface rowMeta, Object[] row ) throws KettleStepException {\n            // Just pass along the data as output of this step...\n            //\n            MetaInject.this.putRow( rowMeta, row );\n          }\n        } );\n      }\n\n      injectTrans.startThreads();\n\n      if ( data.streaming ) {\n        // Deplete all the rows from the parent transformation into the modified transformation\n        //\n        RowSet rowSet = findInputRowSet( data.streamingSourceStepname );\n        if ( rowSet == null ) {\n          throw new KettleException( \"Unable to find step '\" + data.streamingSourceStepname + \"' to stream data from\" );\n        }\n        Object[] row = getRowFrom( rowSet );\n        while ( row != null && !isStopped() ) {\n          rowProducer.putRow( rowSet.getRowMeta(), row );\n          row = getRowFrom( rowSet );\n        }\n        rowProducer.finished();\n      }\n\n      // Wait until the child transformation finished processing...\n      //\n      while ( !injectTrans.isFinished() && !injectTrans.isStopped() && !isStopped() ) {\n        copyResult( injectTrans );\n\n        // Wait a little bit.\n        try {\n          Thread.sleep( 50 );\n        } catch ( Exception e ) {","sourceCodeStart":173,"sourceCodeEnd":209,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/plugins/meta-inject/impl/src/main/java/org/pentaho/di/trans/steps/metainject/MetaInject.java#L173-L209","documentation":"Thrown by MetaInject.processRow() in streaming mode when findInputRowSet() returns null for data.streamingSourceStepname. It means the parent transformation's hop feeding the Meta Inject step has no RowSet from the configured streaming source step, so rows cannot be depleted into the injected sub-transformation.","triggerScenarios":"Running Meta Inject with streaming enabled while the 'streaming source step name' does not match an actual input hop into the Meta Inject step — e.g. the hop was removed, the source step renamed, or the field set from a stale/incorrect value.","commonSituations":"Renaming or deleting the upstream step after configuring streaming injection; enabling streaming with a source step name typed manually; running the transformation where the parent hop is disabled.","solutions":["Verify the step feeding the Meta Inject step is named exactly like the configured streaming source step name","Reopen the Meta Inject dialog, re-pick the streaming source step, and re-save the transformation","Ensure the input hop to the Meta Inject step exists and is enabled","If the name comes from a variable/parameter, log its resolved value at runtime and compare to the actual upstream step name"],"exampleFix":"// before: renamed upstream step, stale config\ndata.streamingSourceStepname = 'CSV Input 1'; // step is now 'CSV Input'\n// after\n// In Spoon: Meta Inject > Streaming source step = 'CSV Input' (re-selected) and re-save","handlingStrategy":"validation","validationCode":"// Verify the streaming source matches the actual hop into Meta Inject\nString prev = meta.getStreamingSourceStepname();\nboolean hopOk = transMeta.findStep(prev) != null &&\n  transMeta.findPreviousSteps(transMeta.findStep('Meta Inject'), true)\n           .stream().anyMatch(s -> s.getName().equals(prev));\nif (!hopOk) throw new IllegalStateException('Streaming source step has no hop into Meta Inject');","typeGuard":"boolean streamingHopExists(TransMeta t, String sourceName, String injectName) {\n  StepMeta src = t.findStep(sourceName);\n  return src != null && t.findStep(injectName) != null &&\n         t.isTransMetaHopBetween(src, t.findStep(injectName));\n}","tryCatchPattern":"try {\n  // execute transformation\n} catch (KettleException e) {\n  if (e.getMessage().contains(\"to stream data from\")) {\n    log.error('Streaming source step misconfigured: ' + e.getMessage(), e);\n  } else throw e;\n}","preventionTips":["Re-select the streaming source step after renaming upstream steps","Never type the streaming source step name manually; use the dialog picker","Keep the input hop to Meta Inject enabled","Log resolved variable values feeding step-name fields"],"tags":["metadata-injection","streaming","rowset"],"backgroundTag":"resource-not-found","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}