pentaho/pentaho-kettle · error · KettleException
UpdateMeta.Exception.UnableToSaveStepInfoToRepository
Error message
UpdateMeta.Exception.UnableToSaveStepInfoToRepository
What it means
UpdateMeta.saveRep failed while persisting the Update step's settings to the repository; any Exception is wrapped in a KettleException with the UnableToSaveStepInfoToRepository message (the step id is appended).
Solutions
- Check the chained cause for the underlying repository SQL error
- Verify repository connection and that the user has write privileges on repository tables
- Retry saving after resolving connectivity; alternatively export the transformation to XML as a workaround
- Check repository table constraints and repair corrupted repository rows
Example fix
// before user: pdi_read (read-only) // after user: pdi_admin (INSERT/UPDATE on r_step_attribute)
Defensive patterns
Strategy: try-catch
Validate before calling
// Before save, check write access: repository.testConnection() and user INSERT/UPDATE grants on repository tables
Try / catch
try { transMeta.saveRep(repository, metaStore, id_transformation, id_step); } catch (KettleException e) { log.error("Save failed for step " + id_step + ": " + e.getCause(), e); } Prevention
- Use a repository user with write privileges
- Monitor repository DB availability before batch saves
- Export to XML as a fallback when repository writes fail
When it happens
Trigger: saveRep -> rep.saveStepAttribute/insertStepDatabase throws (connection loss, constraint violation, insufficient privileges) while saving a transformation.
Common situations: Database repository locked or offline; user lacks INSERT/UPDATE rights on repository tables; duplicate/constraint violations in repository tables.
Related errors
- FuzzyMatchMeta.Exception.UnexpecteErrorReadingStepInfoFromRe…
- GetTableNamesMeta.Exception.UnableToSaveStepInfo
- GPBulkLoaderMeta.Exception.UnexpectedErrorReadingStepInfoFro…
- GPBulkLoaderMeta.Exception.UnexpectedErrorReadingStepInfoFromRepository
- GPBulkLoaderMeta.Exception.UnableToSaveStepInfoToRepository
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/f3497a2762ea944e.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/trans/steps/update/UpdateMeta.java:566
for ( int i = 0; i < keyStream.length; i++ ) {
rep.saveStepAttribute( id_transformation, id_step, i, "key_name", keyStream[i] );
rep.saveStepAttribute( id_transformation, id_step, i, "key_field", keyLookup[i] );
rep.saveStepAttribute( id_transformation, id_step, i, "key_condition", keyCondition[i] );
rep.saveStepAttribute( id_transformation, id_step, i, "key_name2", keyStream2[i] );
}
for ( int i = 0; i < updateLookup.length; i++ ) {
rep.saveStepAttribute( id_transformation, id_step, i, "value_name", updateLookup[i] );
rep.saveStepAttribute( id_transformation, id_step, i, "value_rename", updateStream[i] );
}
// 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, "UpdateMeta.Exception.UnableToSaveStepInfoToRepository" )
+ id_step, e );
}
}
@Override
public void getFields( Bowl bowl, RowMetaInterface row, String name, RowMetaInterface[] info, StepMeta nextStep,
VariableSpace space, Repository repository, IMetaStore metaStore ) throws KettleStepException {
if ( ignoreFlagField != null && ignoreFlagField.length() > 0 ) {
ValueMetaInterface v = new ValueMetaBoolean( ignoreFlagField );
v.setOrigin( name );
row.addValueMeta( v );
}
}
@Override
public void check( List<CheckResultInterface> remarks, TransMeta transMeta, StepMeta stepMeta,View on GitHub (pinned to f3058517a1)