pentaho/pentaho-kettle · error · KettleException
StepMeta.Exception.UnableToSaveStepInfo
StepMeta.Exception.UnableToSaveStepInfo
Error message
Unable to save step info to the repository for id_transformation={0} What it means
saveStepMeta() wraps any KettleException raised while writing a step's fields and attributes into a KettleException 'Unable to save step info to the repository for id_transformation={0}', keeping the original as cause. It indicates the step metadata could not be persisted during transformation save.
Solutions
- Check e.getCause() for the underlying SQL error (constraint, duplicate key, size limit) and correct the step metadata accordingly.
- Ensure all step names within the transformation are unique before saving.
- Verify the repository database is writable and the user has INSERT/UPDATE rights on R_STEP and attribute tables.
- Re-save after fixing; if a partial save occurred, delete the half-saved transformation and re-save cleanly.
Example fix
// before
repository.stepDelegate.saveStepMeta(stepMeta, transId);
// after
if (transMeta.findStep(stepMeta.getName()) != stepMeta) {
throw new KettleException("Duplicate step name: " + stepMeta.getName());
}
repository.stepDelegate.saveStepMeta(stepMeta, transId); Defensive patterns
Strategy: validation
Validate before calling
Set<String> names = new HashSet<>();
for (StepMeta s : transMeta.getSteps()) {
if (!names.add(s.getName())) throw new KettleException("Duplicate step name: " + s.getName());
} Try / catch
try {
repository.stepDelegate.saveStepMeta(stepMeta, transId);
} catch (KettleException e) {
throw new KettleException("Step save failed: " + e.getCause().getMessage(), e);
} Prevention
- Enforce unique step names per transformation
- Verify repository DB is writable and has sufficient column sizes
- Avoid concurrent saves of the same transformation
When it happens
Trigger: repository.stepDelegate.saveStepMeta(stepMeta, transformationId) fails on any of its database inserts/updates (step row insert, deprecated-plugin compatible save, row distribution code, attributes map save) — e.g. constraint violation, duplicate step name in the transformation, or DB write failure.
Common situations: Saving a transformation with two steps sharing the same name; repository table column too small for a plugin attribute; database read-only or disk full; concurrent saves of the same transformation.
Related errors
- GetXMLDataMeta.Exception.ErrorReadingRepository (localized…
- GetXMLDataMeta.Exception.ErrorSavingToRepository (localized…
- StepMeta.Exception.StepCouldNotBeLoaded
- StepMeta.Exception.StepInfoCouldNotBeFound
- TableExists.Meta.UnableLoadRep
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/f595e66027146eea.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/repository/kdr/delegates/KettleDatabaseRepositoryStepDelegate.java:257
compatibleSaveRep( stepMeta.getStepMetaInterface(), repository, transformationId, stepMeta.getObjectId() );
stepMeta.getStepMetaInterface().saveRep(
repository, repository.metaStore, transformationId, stepMeta.getObjectId() );
// Save the name of the clustering schema that was chosen.
//
repository.saveStepAttribute( transformationId, stepMeta.getObjectId(), "cluster_schema", stepMeta
.getClusterSchema() == null ? "" : stepMeta.getClusterSchema().getName() );
// Save the row distribution code (plugin ID)
//
repository.saveStepAttribute( transformationId, stepMeta.getObjectId(), "row_distribution_code", stepMeta
.getRowDistribution() == null ? null : stepMeta.getRowDistribution().getCode() );
// Save the attribute groups map
//
saveAttributesMap( transformationId, stepMeta.getObjectId(), stepMeta.getAttributesMap() );
} catch ( KettleException e ) {
throw new KettleException( BaseMessages.getString( PKG, "StepMeta.Exception.UnableToSaveStepInfo", String
.valueOf( transformationId ) ), e );
}
}
@SuppressWarnings( "deprecation" )
private void compatibleSaveRep( StepMetaInterface stepMetaInterface, KettleDatabaseRepository repository,
ObjectId id_transformation, ObjectId objectId ) throws KettleException {
stepMetaInterface.saveRep( repository, id_transformation, objectId );
}
public void saveStepErrorMeta( StepErrorMeta meta, ObjectId id_transformation, ObjectId id_step ) throws KettleException {
repository.saveStepAttribute( id_transformation, id_step, "step_error_handling_source_step", meta
.getSourceStep() != null ? meta.getSourceStep().getName() : "" );
repository.saveStepAttribute( id_transformation, id_step, "step_error_handling_target_step", meta
.getTargetStep() != null ? meta.getTargetStep().getName() : "" );
repository.saveStepAttribute( id_transformation, id_step, "step_error_handling_is_enabled", meta.isEnabled() );
repository.saveStepAttribute( id_transformation, id_step, "step_error_handling_nr_valuename", meta
.getNrErrorsValuename() );View on GitHub (pinned to f3058517a1)