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

  1. Check the chained cause exception (e.getCause()) to find the actual repository failure
  2. Verify the repository database is reachable and credentials are valid in the Kettle connection
  3. Run the repository upgrade scripts so all step-attribute tables exist for your PDI version
  4. 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

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


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)