pentaho/pentaho-kettle · error · KettleException

BlockUntilStepsFinish.Error.NotSteps

BlockUntilStepsFinish.Error.NotSteps

Error message

BlockUntilStepsFinish.Error.NotSteps

What it means

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.

Solutions

  1. Edit the BlockUntilStepsFinish step and add at least one step to wait for.
  2. Verify the transformation XML/repository contains the step_name attributes for this step.
  3. Re-add and configure the step if its settings were lost.
  4. Add transformation-level validation before run (e.g. checking meta in a test harness).

Example fix

// before (empty config in transformation XML)
<step_name/>
// after
<step_name>Sort rows</step_name>
Defensive patterns

Strategy: validation

Validate before calling

// before executing the transformation
BlockUntilStepsFinishMeta m = (BlockUntilStepsFinishMeta) stepMeta.getStepMetaInterface();
if (m.getStepName() == null || m.getStepName().length == 0) {
  throw new IllegalStateException("BlockUntilStepsFinish step '" + stepMeta.getName()
    + "' has no steps configured to wait for");
}

Try / catch

try {
  trans.execute(null);
} catch (KettleException e) {
  if (e.getMessage() != null && e.getMessage().contains("BlockUntilStepsFinish.Error.NotSteps")) {
    log.error("Configure the wait-for-steps list on the BlockUntilStepsFinish step");
  } else { throw e; }
}

Prevention

When it happens

Trigger: Executing a transformation whose BlockUntilStepsFinish step has an empty 'wait for steps' list (meta.getStepName() null or length 0).

Common situations: 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.

Understand the failure class

Background: "must not be empty", "cannot be empty" — required-field validation errors across open-source libraries — this error's family across 41 libraries.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/9d9c9649f6ea1543. Report an issue: GitHub.

Appendix: source

Thrown at plugins/core/impl/src/main/java/org/pentaho/di/trans/steps/blockuntilstepsfinish/BlockUntilStepsFinish.java:63

  public BlockUntilStepsFinish( StepMeta stepMeta, StepDataInterface stepDataInterface, int copyNr,
    TransMeta transMeta, Trans trans ) {
    super( stepMeta, stepDataInterface, copyNr, transMeta, trans );
  }

  public boolean processRow( StepMetaInterface smi, StepDataInterface sdi ) throws KettleException {
    meta = (BlockUntilStepsFinishMeta) smi;
    data = (BlockUntilStepsFinishData) sdi;

    if ( first ) {
      first = false;
      String[] stepnames = null;
      int stepnrs = 0;
      if ( meta.getStepName() != null && meta.getStepName().length > 0 ) {
        stepnames = meta.getStepName();
        stepnrs = stepnames.length;
      } else {
        throw new KettleException( BaseMessages.getString( PKG, "BlockUntilStepsFinish.Error.NotSteps" ) );
      }
      // Get target stepnames
      String[] targetSteps = getTransMeta().getNextStepNames( getStepMeta() );

      data.stepInterfaces = new ConcurrentHashMap<Integer, StepInterface>();
      for ( int i = 0; i < stepnrs; i++ ) {
        // We can not get metrics from current step
        if ( stepnames[i].equals( getStepname() ) ) {
          throw new KettleException( "You can not wait for step [" + stepnames[i] + "] to finish!" );
        }
        if ( targetSteps != null ) {
          // We can not metrics from the target steps
          for ( int j = 0; j < targetSteps.length; j++ ) {
            if ( stepnames[i].equals( targetSteps[j] ) ) {
              throw new KettleException( "You can not get metrics for the target step [" + targetSteps[j] + "]!" );
            }
          }
        }

View on GitHub (pinned to f3058517a1)