pentaho/pentaho-kettle · error · KettleException
LDIFInputMeta.Exception.ErrorSavingToRepository
LDIFInputMeta.Exception.ErrorSavingToRepository
Error message
LDIFInputMeta.Exception.ErrorSavingToRepository
What it means
LDIFInputMeta.saveRep wraps repository persistence in try/catch and throws KettleException('Error saving step info to repository' + id_step) when any rep.saveStepAttribute call fails. This happens when saving a transformation to a Pentaho Repository and the write of the step's settings fails.
Solutions
- Check the repository DB connection and retry the save.
- Verify the repository user has write (INSERT/UPDATE) privileges on repository tables.
- Check DB server logs/disk space for write failures.
- Save the transformation locally as .ktr as a workaround, then re-save once the repository is healthy.
Example fix
// before: silent failure at save time in Spoon
// after: guard before building
if (!rep.getConnection().isValid(5)) {
throw new KettleException("Repository DB not writable; save locally instead");
} Defensive patterns
Strategy: try-catch
Validate before calling
if (!rep.getConnection().isValid(5) || !rep.hasWritePermission()) {
throw new KettleException("Repository not writable; save locally instead");
} Try / catch
try {
transMeta.saveRep(rep, metaStore, "my transform", null);
} catch (KettleException e) {
log.error("Repository save failed; exporting to .ktr as fallback", e);
transMeta.exportToFile("backup.ktr");
} Prevention
- Ensure repository user has write privileges
- Monitor DB disk space and connection health
- Save local .ktr copies as a fallback
When it happens
Trigger: Saving a transformation in Spoon to a repository DB where saveStepAttribute fails — DB write error, constraint violation, connection loss, read-only account, or missing id_step.
Common situations: Repository account lacks INSERT/UPDATE permissions; database disk full or tablespace exceeded; connection dropped during save; repository object locked or transformation deleted concurrently.
Related errors
- AddSequenceMeta.Exception.UnableToReadStepInfo
- LDIFInputMeta.Exception.ErrorReadingRepository
- Unable to save step information to the repository for…
- Unable to save step information to the repository for…
- Unexpected error reading step information from the…
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/6cb2ad603f23b1f5.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/trans/steps/ldifinput/LDIFInputMeta.java:1023
rep.saveStepAttribute( id_transformation, id_step, i, "field_decimal", field.getDecimalSymbol() );
rep.saveStepAttribute( id_transformation, id_step, i, "field_group", field.getGroupSymbol() );
rep.saveStepAttribute( id_transformation, id_step, i, "field_length", field.getLength() );
rep.saveStepAttribute( id_transformation, id_step, i, "field_precision", field.getPrecision() );
rep.saveStepAttribute( id_transformation, id_step, i, "field_trim_type", field.getTrimTypeCode() );
rep.saveStepAttribute( id_transformation, id_step, i, "field_repeat", field.isRepeated() );
}
rep.saveStepAttribute( id_transformation, id_step, "shortFileFieldName", shortFileFieldName );
rep.saveStepAttribute( id_transformation, id_step, "pathFieldName", pathFieldName );
rep.saveStepAttribute( id_transformation, id_step, "hiddenFieldName", hiddenFieldName );
rep.saveStepAttribute(
id_transformation, id_step, "lastModificationTimeFieldName", lastModificationTimeFieldName );
rep.saveStepAttribute( id_transformation, id_step, "uriNameFieldName", uriNameFieldName );
rep.saveStepAttribute( id_transformation, id_step, "sizeFieldName", sizeFieldName );
rep.saveStepAttribute( id_transformation, id_step, "rootUriNameFieldName", rootUriNameFieldName );
rep.saveStepAttribute( id_transformation, id_step, "extensionFieldName", extensionFieldName );
} catch ( Exception e ) {
throw new KettleException( BaseMessages.getString(
PKG, "LDIFInputMeta.Exception.ErrorSavingToRepository", "" + id_step ), e );
}
}
public FileInputList getFiles( Bowl bowl, VariableSpace space ) {
return FileInputList.createFileList(
bowl, space, fileName, fileMask, excludeFileMask, fileRequired, includeSubFolderBoolean() );
}
private boolean[] includeSubFolderBoolean() {
int len = fileName.length;
boolean[] includeSubFolderBoolean = new boolean[len];
for ( int i = 0; i < len; i++ ) {
includeSubFolderBoolean[i] = YES.equalsIgnoreCase( includeSubFolders[i] );
}
return includeSubFolderBoolean;
}
View on GitHub (pinned to f3058517a1)