pentaho/pentaho-kettle · error · KettleException
Erreur finding step [
Error message
Erreur finding step [
What it means
BlockUntilStepsFinish (Get rows from previous steps until no more) looks up the actual StepInterface objects of the steps it waits on, selected by step name and copy number. It throws this KettleException when findBaseSteps(stepname) returned no step at the requested copy index, meaning the referenced step/copy does not exist (yet) in the running transformation.
Solutions
- Verify the step names and copy numbers listed in the BlockUntilStepsFinish dialog exactly match the target steps in the same transformation (name is case-sensitive; copies are 0-indexed).
- If the step name uses variables, confirm they resolve to the actual step name at runtime.
- Remove or correct copy-number entries that exceed the target step's number of copies.
- If steps were renamed, re-open the BlockUntilStepsFinish step and re-select the target steps.
Example fix
// before (wrong copy number for a single-copied target step) <step_name>Target</step_name><CopyNr>1</CopyNr> // after <step_name>Target</step_name><CopyNr>0</CopyNr>
Defensive patterns
Strategy: validation
Validate before calling
for (int i = 0; i < stepnames.length; i++) {
int copyNr = Const.toInt(transMeta.environmentSubstitute(meta.getStepCopyNr()[i]), 0);
StepMeta sm = transMeta.findStep(stepnames[i]);
if (sm == null || copyNr >= sm.getCopies(transMeta)) {
throw new IllegalStateException("Step not found or bad copy nr: " + stepnames[i] + "#" + copyNr);
}
} Try / catch
try {
// run transformation
} catch (KettleException e) {
if (e.getMessage().startsWith("Erreur finding step")) {
// correct step name/copy config and retry
} else { throw e; }
} Prevention
- Re-select target steps from the dialog list instead of typing names
- Remember copy numbers are 0-indexed and must exist on the target step
- Verify variables resolve before runtime
- Keep the monitored steps in the same transformation
When it happens
Trigger: In processRow during init/first-row processing: copyNr = Const.toInt(environmentSubstitute(meta.getStepCopyNr()[i]),0) then getDispatcher().findBaseSteps(stepnames[i]).get(copyNr) returns null because no step with that name has registered a base step for that copy number.
Common situations: Typo in the step name configured in the 'steps to wait for' grid; the target step is not in the same transformation; wrong/nonexistent copy number (e.g. copy 1 specified but the step has a single copy 0); variables in the step name or copy-nr field that do not resolve at runtime; step name changed after the BlockUntilStepsFinish settings were saved.
Understand the failure class
Background: "Not found" and "does not exist" errors: why "Task not found", "No such folder", and "Can't find" fire when a lookup comes back empty — this error's family across 14 libraries.
Related errors
- We cannot get step [
- At this time we don't support the use of multiple cluster…
- Couldn't find field ' ' in row!
- A deadlock was detected between steps
- AccessInput.Exception.CouldnotFindField
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/1ab328a91a035dc9.
Report an issue: GitHub.
Appendix: source
Thrown at plugins/core/impl/src/main/java/org/pentaho/di/trans/steps/blockuntilstepsfinish/BlockUntilStepsFinish.java:86
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] + "]!" );
}
}
}
int copyNr = Const.toInt( environmentSubstitute( meta.getStepCopyNr()[ i ] ), 0 );
StepInterface step = getDispatcher().findBaseSteps( stepnames[i] ).get( copyNr );
if ( step == null ) {
throw new KettleException( "Erreur finding step [" + stepnames[i] + "] nr copy=" + copyNr + "!" );
}
data.stepInterfaces.put( i, getDispatcher().findBaseSteps( stepnames[i] ).get( copyNr ) );
}
} // end if first
// Wait until all specified steps have finished!
while ( data.continueLoop && !isStopped() ) {
data.continueLoop = false;
Iterator<Entry<Integer, StepInterface>> it = data.stepInterfaces.entrySet().iterator();
while ( it.hasNext() ) {
Entry<Integer, StepInterface> e = it.next();
StepInterface step = e.getValue();
if ( step.getStatus() != StepExecutionStatus.STATUS_FINISHED ) {
// This step is still running...
data.continueLoop = true;
} else {
// We have done with this step.View on GitHub (pinned to f3058517a1)