pentaho/pentaho-kettle · error · KettleException

StepMeta.Exception.UnableToSaveStepInfo

StepMeta.Exception.UnableToSaveStepInfo

Error message

Unable to save step info to the repository for id_transformation={0}

What it means

saveStepMeta() wraps any KettleException raised while writing a step's fields and attributes into a KettleException 'Unable to save step info to the repository for id_transformation={0}', keeping the original as cause. It indicates the step metadata could not be persisted during transformation save.

Solutions

  1. Check e.getCause() for the underlying SQL error (constraint, duplicate key, size limit) and correct the step metadata accordingly.
  2. Ensure all step names within the transformation are unique before saving.
  3. Verify the repository database is writable and the user has INSERT/UPDATE rights on R_STEP and attribute tables.
  4. Re-save after fixing; if a partial save occurred, delete the half-saved transformation and re-save cleanly.

Example fix

// before
repository.stepDelegate.saveStepMeta(stepMeta, transId);
// after
if (transMeta.findStep(stepMeta.getName()) != stepMeta) {
  throw new KettleException("Duplicate step name: " + stepMeta.getName());
}
repository.stepDelegate.saveStepMeta(stepMeta, transId);
Defensive patterns

Strategy: validation

Validate before calling

Set<String> names = new HashSet<>();
for (StepMeta s : transMeta.getSteps()) {
  if (!names.add(s.getName())) throw new KettleException("Duplicate step name: " + s.getName());
}

Try / catch

try {
  repository.stepDelegate.saveStepMeta(stepMeta, transId);
} catch (KettleException e) {
  throw new KettleException("Step save failed: " + e.getCause().getMessage(), e);
}

Prevention

When it happens

Trigger: repository.stepDelegate.saveStepMeta(stepMeta, transformationId) fails on any of its database inserts/updates (step row insert, deprecated-plugin compatible save, row distribution code, attributes map save) — e.g. constraint violation, duplicate step name in the transformation, or DB write failure.

Common situations: Saving a transformation with two steps sharing the same name; repository table column too small for a plugin attribute; database read-only or disk full; concurrent saves of the same transformation.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/repository/kdr/delegates/KettleDatabaseRepositoryStepDelegate.java:257

      compatibleSaveRep( stepMeta.getStepMetaInterface(), repository, transformationId, stepMeta.getObjectId() );
      stepMeta.getStepMetaInterface().saveRep(
        repository, repository.metaStore, transformationId, stepMeta.getObjectId() );

      // Save the name of the clustering schema that was chosen.
      //
      repository.saveStepAttribute( transformationId, stepMeta.getObjectId(), "cluster_schema", stepMeta
        .getClusterSchema() == null ? "" : stepMeta.getClusterSchema().getName() );

      // Save the row distribution code (plugin ID)
      //
      repository.saveStepAttribute( transformationId, stepMeta.getObjectId(), "row_distribution_code", stepMeta
        .getRowDistribution() == null ? null : stepMeta.getRowDistribution().getCode() );

      // Save the attribute groups map
      //
      saveAttributesMap( transformationId, stepMeta.getObjectId(), stepMeta.getAttributesMap() );
    } catch ( KettleException e ) {
      throw new KettleException( BaseMessages.getString( PKG, "StepMeta.Exception.UnableToSaveStepInfo", String
        .valueOf( transformationId ) ), e );
    }
  }

  @SuppressWarnings( "deprecation" )
  private void compatibleSaveRep( StepMetaInterface stepMetaInterface, KettleDatabaseRepository repository,
    ObjectId id_transformation, ObjectId objectId ) throws KettleException {
    stepMetaInterface.saveRep( repository, id_transformation, objectId );
  }

  public void saveStepErrorMeta( StepErrorMeta meta, ObjectId id_transformation, ObjectId id_step ) throws KettleException {
    repository.saveStepAttribute( id_transformation, id_step, "step_error_handling_source_step", meta
      .getSourceStep() != null ? meta.getSourceStep().getName() : "" );
    repository.saveStepAttribute( id_transformation, id_step, "step_error_handling_target_step", meta
      .getTargetStep() != null ? meta.getTargetStep().getName() : "" );
    repository.saveStepAttribute( id_transformation, id_step, "step_error_handling_is_enabled", meta.isEnabled() );
    repository.saveStepAttribute( id_transformation, id_step, "step_error_handling_nr_valuename", meta
      .getNrErrorsValuename() );

View on GitHub (pinned to f3058517a1)