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={id_step} What it means
This KettleException wraps any exception raised while persisting the TextFileInput step's metadata (field name attributes like uriNameFieldName, sizeFieldName, etc.) to the Kettle repository via saveStepAttribute calls. It is a generic repository-save wrapper: the root cause is in the underlying repository connection or schema, preserved as the cause. The step definition cannot be saved until the repository issue is resolved.
Solutions
- Check the chained cause exception (e.getCause()) to find the actual repository failure
- Verify the repository database is reachable and credentials are valid in the Kettle connection
- Run the repository upgrade scripts so all step-attribute tables exist for your PDI version
- Retry saving the transformation; if transient DB connectivity caused it, reconnect and re-save
Example fix
// before
meta.saveRep( rep, transMeta.getRepositoryDirectory(), transMeta.getObjectId(), transMeta.getTransformationID() ); // fails silently at DB level
// after
try {
meta.saveRep( rep, transMeta.getRepositoryDirectory(), transMeta.getObjectId(), transMeta.getTransformationID() );
} catch ( KettleException e ) {
logError( "Repository save failed, cause: " + e.getCause(), e ); // inspect real cause
throw e;
} Defensive patterns
Strategy: try-catch
Validate before calling
// before saving
if ( !rep.isConnected() && !rep.connect() ) {
throw new IllegalStateException( "Repository not connected" );
}
if ( rep.getDatabaseMeta() != null && !rep.getDatabaseMeta().testConnection().isSuccess() ) {
throw new IllegalStateException( "Repository DB unreachable: " + rep.getDatabaseMeta().testConnection().getMessage() );
} Try / catch
try {
meta.saveRep( rep, dir, transId, stepId );
} catch ( KettleException e ) {
Throwable cause = e.getCause();
logError( "Repo save failed: " + ( cause != null ? cause.getMessage() : e.getMessage() ), e );
// retry on transient SQLException / connection timeouts
} Prevention
- Always inspect getCause() — the wrapper hides the real repository error
- Keep the repository schema upgraded to match your PDI version
- Monitor repository DB connectivity before batch save operations
When it happens
Trigger: Calling saveRep() on TextFileInputMeta when the repository is unreachable, the repository schema/tables are missing or outdated (e.g. after a Kettle version upgrade without running the upgrade SQL), or a saveStepAttribute call fails on null/oversized attribute values.
Common situations: Database repository (RDBMS) down or credentials expired after DB maintenance; repository tables not upgraded after a Pentaho Data Integration upgrade; file-based repository corrupted or read-only filesystem; network partition between PDI server and repository database.
Related errors
- ERROR_0002
- HTTPMeta.Exception.UnableToSaveStepInfo
- JobEntryEval.UnableToSaveToRepo
- JobEntryEvalTableContent.UnableSaveRep
- JobEntrySimple.Error.Exception.UnableSaveRep
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/17320da7fcb59492.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/trans/steps/textfileinput/TextFileInputMeta.java:1582
rep.saveStepAttribute( id_transformation, id_step, "error_line_files_ext", errorFilesExtension );
rep.saveStepAttribute(
id_transformation, id_step, "line_number_files_dest_dir", lineNumberFilesDestinationDirectory );
rep.saveStepAttribute( id_transformation, id_step, "line_number_files_ext", lineNumberFilesExtension );
rep.saveStepAttribute( id_transformation, id_step, "date_format_lenient", dateFormatLenient );
rep.saveStepAttribute( id_transformation, id_step, "date_format_locale", dateFormatLocale.toString() );
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, "rootUriNameFieldName", rootUriNameFieldName );
rep.saveStepAttribute( id_transformation, id_step, "extensionFieldName", extensionFieldName );
rep.saveStepAttribute( id_transformation, id_step, "sizeFieldName", sizeFieldName );
} catch ( Exception e ) {
throw new KettleException( "Unable to save step information to the repository for id_step=" + id_step, e );
}
}
@Override
public String[] getFilePaths( Bowl bowl, VariableSpace space ) {
return FileInputList.createFilePathList(
bowl, space, fileName, fileMask, excludeFileMask, fileRequired, includeSubFolderBoolean() );
}
public FileInputList getTextFileList( 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++ ) {View on GitHub (pinned to f3058517a1)