{"record":{"id":"9d9c9649f6ea1543","repo":"pentaho/pentaho-kettle","slug":"blockuntilstepsfinish-error-notsteps","errorCode":"BlockUntilStepsFinish.Error.NotSteps","errorMessage":"BlockUntilStepsFinish.Error.NotSteps","messagePattern":"BlockUntilStepsFinish\\.Error\\.NotSteps","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"plugins/core/impl/src/main/java/org/pentaho/di/trans/steps/blockuntilstepsfinish/BlockUntilStepsFinish.java","lineNumber":63,"sourceCode":"\n  public BlockUntilStepsFinish( StepMeta stepMeta, StepDataInterface stepDataInterface, int copyNr,\n    TransMeta transMeta, Trans trans ) {\n    super( stepMeta, stepDataInterface, copyNr, transMeta, trans );\n  }\n\n  public boolean processRow( StepMetaInterface smi, StepDataInterface sdi ) throws KettleException {\n    meta = (BlockUntilStepsFinishMeta) smi;\n    data = (BlockUntilStepsFinishData) sdi;\n\n    if ( first ) {\n      first = false;\n      String[] stepnames = null;\n      int stepnrs = 0;\n      if ( meta.getStepName() != null && meta.getStepName().length > 0 ) {\n        stepnames = meta.getStepName();\n        stepnrs = stepnames.length;\n      } else {\n        throw new KettleException( BaseMessages.getString( PKG, \"BlockUntilStepsFinish.Error.NotSteps\" ) );\n      }\n      // Get target stepnames\n      String[] targetSteps = getTransMeta().getNextStepNames( getStepMeta() );\n\n      data.stepInterfaces = new ConcurrentHashMap<Integer, StepInterface>();\n      for ( int i = 0; i < stepnrs; i++ ) {\n        // We can not get metrics from current step\n        if ( stepnames[i].equals( getStepname() ) ) {\n          throw new KettleException( \"You can not wait for step [\" + stepnames[i] + \"] to finish!\" );\n        }\n        if ( targetSteps != null ) {\n          // We can not metrics from the target steps\n          for ( int j = 0; j < targetSteps.length; j++ ) {\n            if ( stepnames[i].equals( targetSteps[j] ) ) {\n              throw new KettleException( \"You can not get metrics for the target step [\" + targetSteps[j] + \"]!\" );\n            }\n          }\n        }","sourceCodeStart":45,"sourceCodeEnd":81,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/plugins/core/impl/src/main/java/org/pentaho/di/trans/steps/blockuntilstepsfinish/BlockUntilStepsFinish.java#L45-L81","documentation":"BlockUntilStepsFinish.processRow requires at least one step name configured to wait on. If the step metadata has no step names, it throws a KettleException with the localized message BlockUntilStepsFinish.Error.NotSteps, aborting the step.","triggerScenarios":"Executing a transformation whose BlockUntilStepsFinish step has an empty 'wait for steps' list (meta.getStepName() null or length 0).","commonSituations":"Step added to a transformation but never configured, configuration lost after a copy/paste or metadata migration, or settings cleared when the referenced steps were deleted.","solutions":["Edit the BlockUntilStepsFinish step and add at least one step to wait for.","Verify the transformation XML/repository contains the step_name attributes for this step.","Re-add and configure the step if its settings were lost.","Add transformation-level validation before run (e.g. checking meta in a test harness)."],"exampleFix":"// before (empty config in transformation XML)\n<step_name/>\n// after\n<step_name>Sort rows</step_name>","handlingStrategy":"validation","validationCode":"// before executing the transformation\nBlockUntilStepsFinishMeta m = (BlockUntilStepsFinishMeta) stepMeta.getStepMetaInterface();\nif (m.getStepName() == null || m.getStepName().length == 0) {\n  throw new IllegalStateException(\"BlockUntilStepsFinish step '\" + stepMeta.getName()\n    + \"' has no steps configured to wait for\");\n}","typeGuard":null,"tryCatchPattern":"try {\n  trans.execute(null);\n} catch (KettleException e) {\n  if (e.getMessage() != null && e.getMessage().contains(\"BlockUntilStepsFinish.Error.NotSteps\")) {\n    log.error(\"Configure the wait-for-steps list on the BlockUntilStepsFinish step\");\n  } else { throw e; }\n}","preventionTips":["Always configure the wait list immediately after adding the step.","Review transformation XML/repository for empty step_name entries after migrations.","Re-create the step if its configuration was lost in copy/paste.","Add pre-run metadata validation in CI harnesses."],"tags":["kettle","configuration","missing-config"],"backgroundTag":"empty-required-field","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"}