pentaho/pentaho-kettle · error · KettleException

Unable to save step information to the repository, id_step=

Error message

Unable to save step information to the repository, id_step=

What it means

NumberRangeMeta.saveRep() persists each rule's lower_bound/upper_bound/value attributes to the repository. A KettleDatabaseException thrown by rep.saveStepAttribute is wrapped in a KettleException with 'Unable to save step information to the repository, id_step=<id>'.

Solutions

  1. Inspect the chained KettleDatabaseException for the concrete SQL error.
  2. Verify repository DB connectivity, credentials, and write permissions.
  3. Retry the transformation save once the repository is healthy.
  4. Check for locks/schema issues and run upgrade scripts if versions differ.

Example fix

null
Defensive patterns

Strategy: retry

Validate before calling

// Verify repository write access / DB health before saving transformations

Try / catch

try { meta.saveRep(rep, metaStore, transId, stepId); } catch (KettleException e) { log.error("Save failed for step " + stepId + ": " + e.getCause(), e); /* exponential backoff retry */ }

Prevention

When it happens

Trigger: saveRep(rep, metaStore, id_transformation, id_step) when a saveStepAttribute call raises KettleDatabaseException — DB down, write permissions, constraint failure.

Common situations: Repository database offline or network partition during save; read-only DB user; table lock or schema mismatch after upgrade; disk full on the repository host.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/steps/numberrange/NumberRangeMeta.java:201

  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_transformation, ObjectId id_step ) throws KettleException {
    try {
      rep.saveStepAttribute( id_transformation, id_step, "inputField", inputField );
      rep.saveStepAttribute( id_transformation, id_step, "outputField", outputField );
      rep.saveStepAttribute( id_transformation, id_step, "fallBackValue", getFallBackValue() );

      int i = 0;
      for ( NumberRangeRule rule : rules ) {
        rep
          .saveStepAttribute( id_transformation, id_step, i, "lower_bound", String
            .valueOf( rule.getLowerBound() ) );
        rep
          .saveStepAttribute( id_transformation, id_step, i, "upper_bound", String
            .valueOf( rule.getUpperBound() ) );
        rep.saveStepAttribute( id_transformation, id_step, i, "value", String.valueOf( rule.getValue() ) );
        i++;
      }
    } catch ( KettleDatabaseException dbe ) {
      throw new KettleException( "Unable to save step information to the repository, id_step=" + id_step, dbe );
    }
  }

  @Override
  public void check( List<CheckResultInterface> remarks, TransMeta transMeta, StepMeta stepinfo,
    RowMetaInterface prev, String[] input, String[] output, RowMetaInterface info, VariableSpace space,
    Repository repository, IMetaStore metaStore ) {
    CheckResult cr;
    if ( prev == null || prev.size() == 0 ) {
      cr =
        new CheckResult(
          CheckResult.TYPE_RESULT_WARNING, "Not receiving any fields from previous steps!", stepinfo );
      remarks.add( cr );
    } else {
      cr =
        new CheckResult( CheckResult.TYPE_RESULT_OK, "Step is connected to previous one, receiving "
          + prev.size() + " fields", stepinfo );
      remarks.add( cr );

View on GitHub (pinned to f3058517a1)