pentaho/pentaho-kettle · error · KettleException
SynchronizeAfterMergeMeta.Exception.UnableToSaveStepInfoToRe…
Error message
SynchronizeAfterMergeMeta.Exception.UnableToSaveStepInfoToRepository
What it means
SynchronizeAfterMergeMeta.saveRep() failed while persisting the step's settings to the repository (KettleException 'Unable to save step info to repository' + id_step). Any exception during attribute writes or insertStepDatabase is wrapped and rethrown, leaving the transformation partially saved.
Solutions
- Verify the repository user has INSERT/UPDATE privileges on the repository tables
- Check repository DB connectivity and retry the save
- Inspect the 'Caused by' exception to identify the failing SQL statement
- Free space / unlock the repository database if it is read-only or out of quota
Example fix
// before: user lacks privilege -> save fails GRANT INSERT, UPDATE, DELETE ON R_STEP_ATTRIBUTE TO pdi_user; // then retry saving the transformation in Spoon
Defensive patterns
Strategy: try-catch
Validate before calling
// before saveRep
if (!repository.isConnected()) throw new IllegalStateException("Repository not connected");
// verify write access
repository.getCountStepAttribute(id_step, "value_name", 0); // probe read; ensure user has write grants via DB check Try / catch
try { stepMeta.saveRep(repository, metaStore, idTrans, idStep); }
catch (KettleException e) { log.error("Repository save failed for step " + idStep + " — check grants/connection: " + e.getMessage(), e.getCause()); throw e; } Prevention
- Grant the PDI repository user INSERT/UPDATE/DELETE privileges
- Avoid saving during repository maintenance/read-only windows
- Test repository connectivity before batch saves
- Monitor repository disk space
When it happens
Trigger: Repository insert fails while saving the step: DB connection lost, insufficient write permission, constraint violation, or database read-only mode during save of a transformation containing this step.
Common situations: Repository DB credentials lacking INSERT privileges; repository database in read-only/locked state; storage quota or connectivity failure on the repository server.
Related errors
- AddSequenceMeta.Exception.UnableToSaveStepInfo
- ERROR_0003
- InsertUpdateMeta.Exception.UnableToSaveStepInfoToRepository
- JobEntryMSAccessBulkLoad.Meta.UnableSave
- JobPGPEncryptFiles.Error.Exception.UnableSaveRep
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/ee8bbd9294135f3e.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/trans/steps/synchronizeaftermerge/SynchronizeAfterMergeMeta.java:630
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] );
rep.saveStepAttribute( id_transformation, id_step, i, "value_update", update[i].booleanValue() );
}
// 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, "SynchronizeAfterMergeMeta.Exception.UnableToSaveStepInfoToRepository" )
+ id_step, e );
}
}
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 );
db.shareVariablesWith( transMeta );
try {
db.connect();
if ( !Utils.isEmpty( tableName ) ) {View on GitHub (pinned to f3058517a1)