pentaho/pentaho-kettle · error · KettleException
Unable to save step information to the repository for…
Error message
Unable to save step information to the repository for id_step=
What it means
XMLJoinMeta.saveRep persists the step's settings (targetXPath, joinCompareField, encoding, omitXMLHeader, omitNullValues) as step attributes in the Kettle repository. Any exception raised by the repository while saving these attributes is wrapped in this KettleException with the step id appended. It signals that the step definition could not be persisted, not that a transformation run failed.
Solutions
- Check repository connectivity and reconnect before saving
- Verify the repository user has write permissions
- Retry saving the transformation after fixing the repository
- Inspect the wrapped cause (e.getCause()) for the underlying repository error
Example fix
// before
rep.saveStepAttribute( id_transformation, id_step, "encoding", encoding );
// after
if ( rep == null ) { return; } // skip repository save when running file-only
rep.saveStepAttribute( id_transformation, id_step, "encoding", encoding ); Defensive patterns
Strategy: try-catch
Validate before calling
// before saving
if ( rep == null || !rep.isConnected() ) { throw new IllegalStateException("Repository not connected"); } Type guard
boolean repoWritable = rep != null && rep.isConnected();
Try / catch
try { meta.saveRep(rep, metaStore, idTransformation, idStep); } catch (KettleException e) { log.error("Repo save failed for step", e); throw e; } Prevention
- Check repository connectivity before programmatic saves
- Grant repository write permissions to service accounts
- Keep repository DB backups; watch for quota/size limits
- Always inspect the KettleException cause chain
When it happens
Trigger: Calling saveRep during transformation save when the repository connection is broken, the repository is read-only, a saveStepAttribute call fails (e.g. invalid id_step, database error), or encoding/attribute values cannot be stored.
Common situations: Saving a transformation to a database repository that has gone down or lost connectivity; saving to a repository where the user lacks write permission; corrupted repository metadata tables.
Related errors
- AddSequenceMeta.Exception.UnableToSaveStepInfo
- ColumnExistsMeta.Exception.UnableToSaveStepInfo
- ColumnExistsMeta.Exception.UnexpectedErrorReadingStepInfo
- CreditCardValidatorMeta.Exception.UnableToSaveStepInfo
- CubeInputMeta.Exception.UnableToSaveStepInfo
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/ea2701b0e624cd6c.
Report an issue: GitHub.
Appendix: source
Thrown at plugins/xml/core/src/main/java/org/pentaho/di/trans/steps/xmljoin/XMLJoinMeta.java:232
}
}
public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_transformation, ObjectId id_step )
throws KettleException {
try {
rep.saveStepAttribute( id_transformation, id_step, "valueXMLfield", valueXMLfield );
rep.saveStepAttribute( id_transformation, id_step, "targetXMLstep", targetXMLstep );
rep.saveStepAttribute( id_transformation, id_step, "targetXMLfield", targetXMLfield );
rep.saveStepAttribute( id_transformation, id_step, "sourceXMLstep", sourceXMLstep );
rep.saveStepAttribute( id_transformation, id_step, "sourceXMLfield", sourceXMLfield );
rep.saveStepAttribute( id_transformation, id_step, "complexJoin", complexJoin );
rep.saveStepAttribute( id_transformation, id_step, "targetXPath", targetXPath );
rep.saveStepAttribute( id_transformation, id_step, "joinCompareField", joinCompareField );
rep.saveStepAttribute( id_transformation, id_step, "encoding", encoding );
rep.saveStepAttribute( id_transformation, id_step, "omitXMLHeader", omitXMLHeader );
rep.saveStepAttribute( id_transformation, id_step, "omitNullValues", omitNullValues );
} catch ( Exception e ) {
throw new KettleException( "Unable to save step information to the repository for id_step=" + 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;
// checks for empty field which are required
if ( this.targetXMLstep == null || this.targetXMLstep.length() == 0 ) {
cr =
new CheckResult( CheckResultInterface.TYPE_RESULT_ERROR, BaseMessages.getString( PKG,
"XMLJoin.CheckResult.TargetXMLStepNotSpecified" ), stepMeta );
remarks.add( cr );
} else {
cr =
new CheckResult( CheckResultInterface.TYPE_RESULT_OK, BaseMessages.getString( PKG,
"XMLJoin.CheckResult.TargetXMLStepSpecified" ), stepMeta );View on GitHub (pinned to f3058517a1)