pentaho/pentaho-kettle · error · KettleException
CombinationLookupMeta.Exception.UnableToSaveStepInfo
Error message
CombinationLookupMeta.Exception.UnableToSaveStepInfo
What it means
Generic KettleException thrown by CombinationLookupMeta.saveRep when persisting the step configuration to the repository fails. The localized message 'Unable to save step information to the repository ... id_step=' is concatenated with the step id, and the original exception is attached as cause.
Solutions
- Check the wrapped cause; if it points at insertStepDatabase, save the database connection first so its ObjectId is not null.
- Verify repository write permissions and that the repository isn't locked or read-only.
- Run repository upgrade scripts if the schema predates your PDI version.
- Retry the save after resolving contention (another open transformation holding locks).
Example fix
// before: step references an unsaved shared connection -> insertStepDatabase(null id) // after: save the DatabaseMeta first // rep.save(databaseMeta, id_transformation, null); // stepMeta.setDatabaseMeta(databaseMeta); // rep.saveStepAttribute(...) // then save the transformation
Defensive patterns
Strategy: try-catch
Validate before calling
// before save: ensure the referenced connection is persisted // if (meta.getDatabaseMeta() != null && meta.getDatabaseMeta().getObjectId() == null) // rep.save(meta.getDatabaseMeta(), id_transformation, null);
Try / catch
try {
repository.save(transMeta, "comment", null);
} catch (KettleException e) {
log.error("Save of step to repository failed for id_step=" + e.getCause(), e);
} Prevention
- Save shared database connections before the steps that use them.
- Ensure repository users have write privileges and quota.
- Avoid concurrent edits of the same transformation by multiple sessions.
- Run repository schema upgrades before saving from a newer client.
When it happens
Trigger: saveRep throws while writing step attributes or while rep.insertStepDatabase(id_transformation, id_step, databaseMeta.getObjectId()) is called after saving the main attributes.
Common situations: Repository read-only or out of quota; transaction locked by another user/session; foreign key issues when databaseMeta.getObjectId() is null (connection not yet saved); repository schema mismatch after upgrade.
Related errors
- AppendMeta.Exception.UnableToSaveStepInfo
- NormaliserMeta.Exception.UnableToSaveStepInfoToRepository
- NullIfMeta.Exception.UnableToSaveStepInfoToRepository
- Unable to save step information to the repository, id_step=
- AccessInputMeta.Exception.ErrorReadingRepository
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/2d8ea7bc4a8452f5.
Report an issue: GitHub.
Appendix: source
Thrown at plugins/core/impl/src/main/java/org/pentaho/di/trans/steps/combinationlookup/CombinationLookupMeta.java:604
rep.saveStepAttribute( id_transformation, id_step, i, "lookup_key_name", keyField[ i ] );
rep.saveStepAttribute( id_transformation, id_step, i, "lookup_key_field", keyLookup[ i ] );
}
rep.saveStepAttribute( id_transformation, id_step, "return_name", technicalKeyField );
rep.saveStepAttribute( id_transformation, id_step, "sequence", sequenceFrom );
rep.saveStepAttribute( id_transformation, id_step, "creation_method", techKeyCreation );
// For the moment still save 'use_autoinc' for backwards compatibility (Sven Boden).
rep.saveStepAttribute( id_transformation, id_step, "use_autoinc", useAutoinc );
rep.saveStepAttribute( id_transformation, id_step, "last_update_field", lastUpdateField );
// Also, save the step-database relationship!
if ( databaseMeta != null ) {
rep.insertStepDatabase( id_transformation, id_step, databaseMeta.getObjectId() );
}
} catch ( Exception e ) {
throw new KettleException( BaseMessages.getString(
PKG, "CombinationLookupMeta.Exception.UnableToSaveStepInfo" )
+ id_step, e );
}
}
@Override
public void check( List<CheckResultInterface> remarks, TransMeta transMeta, StepMeta stepMeta,
RowMetaInterface prev, String[] input, String[] output, RowMetaInterface info, VariableSpace space,
Repository repository, IMetaStore metaStore ) {
CheckResult cr;
String error_message = "";
if ( databaseMeta != null ) {
Database db = new Database( loggingObject, databaseMeta );
try {
db.connect();
if ( !Utils.isEmpty( tablename ) ) {View on GitHub (pinned to f3058517a1)