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

SortRowsMeta.saveRep() persists each sort field's attributes (name, ascending, case sensitivity, collator enabled/strength, presorted) to the repository. A failure in any saveStepAttribute call is wrapped in a KettleException 'Unable to save step information to the repository for id_step=...'.

Solutions

  1. Check the repository user has write (INSERT/UPDATE) privileges on the step attribute tables.
  2. Verify repository connectivity during save; retry after network issues.
  3. Check DB error/log for constraint or space errors and fix the underlying DB problem.
  4. Test saving a trivial transformation to isolate whether it is step-specific or repository-wide.
  5. If a lock/transaction conflict, ask other users to release and retry the save.

Example fix

-- before
GRANT SELECT ON r_step_attribute TO kettle_user;
-- after
GRANT SELECT, INSERT, UPDATE, DELETE ON r_step_attribute TO kettle_user;
Defensive patterns

Strategy: try-catch

Try / catch

try { repo.save(transMeta, path, metaStore); } catch (KettleException e) {
  if (e.getMessage().contains("Unable to save step information")) {
    logError("Repository write failed: " + e.getCause());
    // check permissions/connection then retry
  }
}

Prevention

When it happens

Trigger: Saving a transformation whose Sort rows step attributes cannot be written: repository connection dropped, read-only repository user, DB constraint violations, or transaction errors.

Common situations: Read-only or insufficient DB permissions for the Kettle repository user; repository storage full; network interruption mid-save; repository lock contention.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/steps/sort/SortRowsMeta.java:380

    try {
      rep.saveStepAttribute( id_transformation, id_step, "directory", directory );
      rep.saveStepAttribute( id_transformation, id_step, "prefix", prefix );
      rep.saveStepAttribute( id_transformation, id_step, "sort_size", sortSize );
      rep.saveStepAttribute( id_transformation, id_step, "free_memory", freeMemoryLimit );
      rep.saveStepAttribute( id_transformation, id_step, "compress", compressFiles );
      rep.saveStepAttribute( id_transformation, id_step, "compress_variable", compressFilesVariable );
      rep.saveStepAttribute( id_transformation, id_step, "unique_rows", onlyPassingUniqueRows );

      for ( int i = 0; i < fieldName.length; i++ ) {
        rep.saveStepAttribute( id_transformation, id_step, i, "field_name", fieldName[i] );
        rep.saveStepAttribute( id_transformation, id_step, i, "field_ascending", ascending[i] );
        rep.saveStepAttribute( id_transformation, id_step, i, "field_case_sensitive", caseSensitive[i] );
        rep.saveStepAttribute( id_transformation, id_step, i, "field_collator_enabled", collatorEnabled[i] );
        rep.saveStepAttribute( id_transformation, id_step, i, "field_collator_strength", collatorStrength[i] );
        rep.saveStepAttribute( id_transformation, id_step, i, "field_presorted", preSortedField[i] );
      }
    } catch ( Exception e ) {
      throw new KettleException( "Unable to save step information to the repository for id_step=" + id_step, e );
    }
  }

  @Override
  public void getFields( Bowl bowl, RowMetaInterface inputRowMeta, String name, RowMetaInterface[] info,
      StepMeta nextStep, VariableSpace space, Repository repository, IMetaStore metaStore ) throws KettleStepException {
    // Set the sorted properties: ascending/descending
    assignSortingCriteria( inputRowMeta );
  }

  @SuppressWarnings( "WeakerAccess" )
  public void assignSortingCriteria( RowMetaInterface inputRowMeta ) {
    for ( int i = 0; i < fieldName.length; i++ ) {
      int idx = inputRowMeta.indexOfValue( fieldName[i] );
      if ( idx >= 0 ) {
        ValueMetaInterface valueMeta = inputRowMeta.getValueMeta( idx );
        // On all these valueMetas, check to see if the value actually exists before we try to
        // set them.

View on GitHub (pinned to f3058517a1)