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

ClosureGeneratorMeta.saveRep writes the step's settings (parent_id_field, child_id_field, distance_field, is_root_zero) to the Pentaho Repository. Any repository write failure is rethrown as a KettleException whose message includes the failing id_step. It means the step's metadata could not be persisted.

Solutions

  1. Check repository DB connectivity and write privileges
  2. Free DB disk space or unlock read-only state
  3. Retry the save; fall back to exporting as XML
  4. Inspect repository DB error logs
Defensive patterns

Strategy: try-catch

Validate before calling

if (repository.isReadOnly()) throw new IllegalStateException("Repository is read-only");

Try / catch

try {
  transMeta.save(rep, metaStore, comment);
} catch (KettleException e) {
  if (e.getMessage().contains("Unable to save step information")) {
    log.error("Save failed for id_step in message; export to XML as fallback", e);
  }
}

Prevention

When it happens

Trigger: Saving a transformation to the repository when rep.saveStepAttribute throws — DB write failure, constraint violation, insufficient privileges.

Common situations: Read-only repository DB, disk-full on the DB server, DB user lacking INSERT privileges on R_STEP_ATTRIBUTE.

Related errors


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

Appendix: source

Thrown at plugins/core/impl/src/main/java/org/pentaho/di/trans/steps/closure/ClosureGeneratorMeta.java:154

      parentIdFieldName = rep.getStepAttributeString( id_step, "parent_id_field" );
      childIdFieldName = rep.getStepAttributeString( id_step, "child_id_field" );
      distanceFieldName = rep.getStepAttributeString( id_step, "distance_field" );
      rootIdZero = rep.getStepAttributeBoolean( id_step, "is_root_zero" );
    } catch ( Exception e ) {
      throw new KettleException( "Unexpected error reading step information from the repository", e );
    }
  }

  @Override
  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_transformation, ObjectId id_step )
    throws KettleException {
    try {
      rep.saveStepAttribute( id_transformation, id_step, "parent_id_field", parentIdFieldName );
      rep.saveStepAttribute( id_transformation, id_step, "child_id_field", childIdFieldName );
      rep.saveStepAttribute( id_transformation, id_step, "distance_field", distanceFieldName );
      rep.saveStepAttribute( id_transformation, id_step, "is_root_zero", rootIdZero );
    } catch ( Exception e ) {
      throw new KettleException( "Unable to save step information to the repository for id_step=" + id_step, e );
    }
  }

  @Override
  public void check( List<CheckResultInterface> remarks, TransMeta transMeta, StepMeta stepMeta,
                     RowMetaInterface prev, String[] input, String[] output, RowMetaInterface info, VariableSpace space,
                     Repository repository, IMetaStore metaStore ) {
    CheckResult cr;

    ValueMetaInterface parentValueMeta = prev.searchValueMeta( parentIdFieldName );
    if ( parentValueMeta != null ) {
      cr =
        new CheckResult(
          CheckResultInterface.TYPE_RESULT_ERROR, "The fieldname of the parent id could not be found.",
          stepMeta );
      remarks.add( cr );
    } else {
      cr =

View on GitHub (pinned to f3058517a1)