pentaho/pentaho-kettle · error · KettleException
ExecProcessMeta.Exception.UnableToSaveStepInfo
Error message
ExecProcessMeta.Exception.UnableToSaveStepInfo
What it means
KettleException thrown by ExecProcessMeta.saveRep() when saving the step's attributes to the repository fails, with id_step appended to the message. It wraps the underlying exception thrown by rep.saveStepAttribute() calls (including the per-argument argumentFieldName loop).
Solutions
- Check getCause() of the KettleException for the JDBC-level failure (permissions, constraint, timeout).
- Confirm the repository user has write privileges to the transformation's folder.
- Re-open and re-save the transformation in Spoon to get a fresh valid id_step.
- If repeated, check the repository DB for lock contention or disk space.
Example fix
// before
meta.saveRep(rep, metaStore, transMeta.getObjectId(), stepMeta.getObjectId());
// after
try {
meta.saveRep(rep, metaStore, transMeta.getObjectId(), stepMeta.getObjectId());
} catch (KettleException e) {
log.error("save failed for step " + stepMeta.getName() + ": " + e.getCause(), e);
} Defensive patterns
Strategy: try-catch
Validate before calling
if (id_step == null) throw new IllegalStateException("step must be persisted before saveRep"); Try / catch
try { meta.saveRep(rep, metaStore, id_trans, id_step); } catch (KettleException e) { handleSaveFailure(id_step, e.getCause()); } Prevention
- Ensure repository user has write permissions
- Save referenced connections before the step
- Avoid concurrent edits of the same transformation
When it happens
Trigger: saveRep() fails on any rep.saveStepAttribute(id_transformation, id_step, ...) call — repository write error, constraint violation, lost DB connection, or read-only repository.
Common situations: Repository database read-only or out of space; concurrent edit of the same transformation causing lock/conflict; step has never been persisted so id_step is invalid; JDBC timeout during save.
Related errors
- AppendMeta.Exception.UnableToSaveStepInfo
- CombinationLookupMeta.Exception.UnableToSaveStepInfo
- DynamicSQLRowMeta.Exception.UnableToSaveStepInfo
- ExecSQLRowMeta.Exception.UnableToSaveStepInfo
- FilterRowsMeta.Exception.UnableToSaveStepInfoToRepository
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/9051521457c7aa36.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/trans/steps/execprocess/ExecProcessMeta.java:313
PKG, "ExecProcessMeta.Exception.UnexpectedErrorReadingStepInfo" ), e );
}
}
@Override
public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_transformation, ObjectId id_step ) throws KettleException {
try {
rep.saveStepAttribute( id_transformation, id_step, "processfield", processfield );
rep.saveStepAttribute( id_transformation, id_step, "resultfieldname", resultfieldname );
rep.saveStepAttribute( id_transformation, id_step, "errorfieldname", errorfieldname );
rep.saveStepAttribute( id_transformation, id_step, "exitvaluefieldname", exitvaluefieldname );
rep.saveStepAttribute( id_transformation, id_step, "failwhennotsuccess", failwhennotsuccess );
rep.saveStepAttribute( id_transformation, id_step, "outputlinedelimiter", outputLineDelimiter );
rep.saveStepAttribute( id_transformation, id_step, "argumentsInFields", argumentsInFields );
for ( int i = 0; i < argumentFieldNames.length; i++ ) {
rep.saveStepAttribute( id_transformation, id_step, i, "argumentFieldName", argumentFieldNames[i] );
}
} catch ( Exception e ) {
throw new KettleException( BaseMessages.getString( PKG, "ExecProcessMeta.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 ( Utils.isEmpty( resultfieldname ) ) {
error_message = BaseMessages.getString( PKG, "ExecProcessMeta.CheckResult.ResultFieldMissing" );
cr = new CheckResult( CheckResult.TYPE_RESULT_ERROR, error_message, stepMeta );
} else {
error_message = BaseMessages.getString( PKG, "ExecProcessMeta.CheckResult.ResultFieldOK" );
cr = new CheckResult( CheckResult.TYPE_RESULT_OK, error_message, stepMeta );
}View on GitHub (pinned to f3058517a1)