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

GetFileNamesMeta.saveRep() wraps any exception raised while persisting this step's attributes (file name, mask, exclude mask, required flag, include-subfolders flag) to the Kettle repository in a KettleException with this message and the id_step. It indicates the step's metadata could not be saved, so the transformation definition is incomplete in the repository.

Solutions

  1. Check repository connectivity and retry saving the transformation.
  2. Verify the repository user has write permission on the transformation/step tables.
  3. Inspect the wrapped cause (e.getCause()) for the underlying SQL/repository error.
  4. Shorten file mask/name values that exceed repository column lengths.

Example fix

// before
rep.saveStepAttribute( id_transformation, id_step, i, "file_mask", fileMask[i] ); // NPE if fileMask[i] null
// after
rep.saveStepAttribute( id_transformation, id_step, i, "file_mask", fileMask[i] == null ? "" : fileMask[i] );
Defensive patterns

Strategy: try-catch

Validate before calling

if (transMeta.getRepository() != null && transMeta.getRepository().isConnected()) { transMeta.saveRep(repo.getRepositoryDirectory(), metaStore, "myTrans"); }

Try / catch

try { transMeta.saveRep(dir, metaStore, name); } catch (KettleException e) { log.error("Step save failed for id_step=" + e.getMessage(), e.getCause()); /* retry or save to XML instead */ }

Prevention

When it happens

Trigger: Calling saveRep() (via transformation save) when a rep.saveStepAttribute() call fails for any of the per-file attributes: repository connection loss, DB constraint violation, null array entries, or repository read-only.

Common situations: Repository database down or network dropped mid-save; saving a transformation whose Get File Names step table has a column size smaller than the mask value; concurrent modification of the same transformation by two designers.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/f29a8e745626966c. Report an issue: GitHub.

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/steps/getfilenames/GetFileNamesMeta.java:660

      rep.saveStepAttribute( id_transformation, id_step, "isaddresult", isaddresult );
      rep.saveStepAttribute( id_transformation, id_step, "filefield", filefield );
      rep.saveStepAttribute( id_transformation, id_step, "filename_Field", dynamicFilenameField );
      rep.saveStepAttribute( id_transformation, id_step, "wildcard_Field", dynamicWildcardField );
      rep.saveStepAttribute( id_transformation, id_step, "exclude_wildcard_Field", dynamicExcludeWildcardField );
      rep.saveStepAttribute( id_transformation, id_step, "dynamic_include_subfolders", dynamicIncludeSubFolders );

      rep.saveStepAttribute( id_transformation, id_step, "rownum_field", rowNumberField );
      rep.saveStepAttribute( id_transformation, id_step, "limit", rowLimit );

      for ( int i = 0; i < fileName.length; i++ ) {
        rep.saveStepAttribute( id_transformation, id_step, i, "file_name", fileName[i] );
        rep.saveStepAttribute( id_transformation, id_step, i, "file_mask", fileMask[i] );
        rep.saveStepAttribute( id_transformation, id_step, i, "exclude_file_mask", excludeFileMask[i] );
        rep.saveStepAttribute( id_transformation, id_step, i, "file_required", fileRequired[i] );
        rep.saveStepAttribute( id_transformation, id_step, i, "include_subfolders", includeSubFolders[i] );
      }
    } catch ( Exception e ) {
      throw new KettleException( "Unable to save step information to the repository for id_step=" + id_step, e );
    }
  }

  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;
  }

  public String[] getIncludeSubFolders() {
    return includeSubFolders;
  }

  private FileInputList.FileTypeFilter[] buildFileTypeFiltersArray( String[] fileName ) {
    FileInputList.FileTypeFilter[] filters = new FileInputList.FileTypeFilter[fileName.length];

View on GitHub (pinned to f3058517a1)