pentaho/pentaho-kettle · error · KettleException
Unable to save step information to the repository, id_step=
Error message
Unable to save step information to the repository, id_step=<id_step>
What it means
DummyPluginMeta.saveRep writes the step's value metadata and text into repository step attributes. If any rep.saveStepAttribute call throws KettleDatabaseException (insert/update failure against the repository DB), it is rethrown as a KettleException with this message plus id_step. Note saveRep also assumes value is non-null, so an internal NPE would not produce this message.
Solutions
- Check the chained KettleDatabaseException/JDBC cause for the precise DB error (permissions, constraint, connectivity).
- Verify the repository user has write (INSERT/UPDATE) privileges on the step-attribute tables.
- Test repository connectivity and DB disk space; retry saving after fixing.
- Ensure the Dummy step's value is set (open the dialog and confirm) so saveRep has valid metadata to write.
Example fix
// before: read-only repo user GRANT SELECT ON R_STEP_ATTRIBUTE TO pdi_user; // after: grant write access GRANT SELECT, INSERT, UPDATE, DELETE ON R_STEP_ATTRIBUTE TO pdi_user;
Defensive patterns
Strategy: try-catch
Validate before calling
// ensure the step has a value and the repo is writable before save
if ( meta.getValue() == null ) {
meta.setDefault(); // supplies 123.456 Number default
}
// probe write access
rep.saveStepAttribute( id_transformation, id_step, 0, "probe_attr", "ok" ); Try / catch
try {
meta.saveRep( rep, id_transformation, id_step );
} catch ( KettleException e ) {
Throwable cause = e.getCause();
if ( cause instanceof KettleDatabaseException ) {
logError( "Repository write failed for id_step=" + id_step + ": " + cause.getMessage() );
// retry after checking DB connectivity/permissions
}
throw e;
} Prevention
- Grant the repository user INSERT/UPDATE/DELETE on step-attribute tables
- Monitor repository DB disk space and read-only mode
- Set the Dummy step's value in the dialog before saving (avoid null value NPEs)
- Save transformations serially if concurrent saves cause lock conflicts
When it happens
Trigger: saveRep(rep, id_transformation, id_step) failing on any of the saveStepAttribute calls: repository DB down, transaction/lock conflict, read-only repository account, attribute value exceeding column size, or DB constraint violation.
Common situations: Repository DB out of disk space or in read-only mode; saving a transformation with credentials lacking INSERT/UPDATE rights on R_STEP_ATTRIBUTE; unique-constraint collisions after concurrent saves; connection dropped mid-save.
Related errors
- Edi2Xml.Exception.UnableToSaveStepInfoToRepository
- error reading step with id_step=
- JobEntryZipFile.UnableLoadJobEntryRep
- JobEntryZipFile.UnableSaveJobEntryRep
- ScriptMeta.Exception.UnableToSaveStepInfo
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/8f1e0f4738ad4eb7.
Report an issue: GitHub.
Appendix: source
Thrown at plugins/dummy/core/src/main/java/org/pentaho/di/be/ibridge/kettle/dummy/DummyPluginMeta.java:177
}
} catch ( KettleDatabaseException dbe ) {
throw new KettleException( "error reading step with id_step=" + id_step + " from the repository", dbe );
} catch ( Exception e ) {
throw new KettleException( "Unexpected error reading step with id_step=" + id_step + " from the repository", e );
}
}
@Override
public void saveRep( Repository rep, ObjectId id_transformation, ObjectId id_step ) throws KettleException {
try {
rep.saveStepAttribute( id_transformation, id_step, "value_name", value.getValueMeta().getName() );
rep.saveStepAttribute( id_transformation, id_step, 0, "value_type", value.getValueMeta().getTypeDesc() );
rep.saveStepAttribute( id_transformation, id_step, 0, "value_text", value.getValueMeta().getString( value.getValueData() ) );
rep.saveStepAttribute( id_transformation, id_step, 0, "value_null", value.getValueMeta().isNull( value.getValueData() ) );
rep.saveStepAttribute( id_transformation, id_step, 0, "value_length", value.getValueMeta().getLength() );
rep.saveStepAttribute( id_transformation, id_step, 0, "value_precision", value.getValueMeta().getPrecision() );
} catch ( KettleDatabaseException dbe ) {
throw new KettleException( "Unable to save step information to the repository, id_step=" + id_step, dbe );
}
}
@Override
public void check( List<CheckResultInterface> remarks, TransMeta transmeta, StepMeta stepMeta, RowMetaInterface prev, String[] input, String[] output, RowMetaInterface info ) {
CheckResult cr;
if ( prev == null || prev.size() == 0 ) {
cr = new CheckResult( CheckResult.TYPE_RESULT_WARNING, "Not receiving any fields from previous steps!", stepMeta );
remarks.add( cr );
} else {
cr = new CheckResult( CheckResult.TYPE_RESULT_OK, "Step is connected to previous one, receiving " + prev.size() + " fields", stepMeta );
remarks.add( cr );
}
// See if we have input streams leading to this step!
if ( input.length > 0 ) {
cr = new CheckResult( CheckResult.TYPE_RESULT_OK, "Step is receiving info from other steps.", stepMeta );
remarks.add( cr );View on GitHub (pinned to f3058517a1)