pentaho/pentaho-kettle · error · KettleException

ExecProcessMeta.Exception.UnableToSaveStepInfo

Error message

ExecProcessMeta.Exception.UnableToSaveStepInfo

What it means

KettleException thrown by ExecProcessMeta.saveRep() when saving the step's attributes to the repository fails, with id_step appended to the message. It wraps the underlying exception thrown by rep.saveStepAttribute() calls (including the per-argument argumentFieldName loop).

Solutions

  1. Check getCause() of the KettleException for the JDBC-level failure (permissions, constraint, timeout).
  2. Confirm the repository user has write privileges to the transformation's folder.
  3. Re-open and re-save the transformation in Spoon to get a fresh valid id_step.
  4. If repeated, check the repository DB for lock contention or disk space.

Example fix

// before
meta.saveRep(rep, metaStore, transMeta.getObjectId(), stepMeta.getObjectId());
// after
try {
  meta.saveRep(rep, metaStore, transMeta.getObjectId(), stepMeta.getObjectId());
} catch (KettleException e) {
  log.error("save failed for step " + stepMeta.getName() + ": " + e.getCause(), e);
}
Defensive patterns

Strategy: try-catch

Validate before calling

if (id_step == null) throw new IllegalStateException("step must be persisted before saveRep");

Try / catch

try { meta.saveRep(rep, metaStore, id_trans, id_step); } catch (KettleException e) { handleSaveFailure(id_step, e.getCause()); }

Prevention

When it happens

Trigger: saveRep() fails on any rep.saveStepAttribute(id_transformation, id_step, ...) call — repository write error, constraint violation, lost DB connection, or read-only repository.

Common situations: Repository database read-only or out of space; concurrent edit of the same transformation causing lock/conflict; step has never been persisted so id_step is invalid; JDBC timeout during save.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/steps/execprocess/ExecProcessMeta.java:313

        PKG, "ExecProcessMeta.Exception.UnexpectedErrorReadingStepInfo" ), e );
    }
  }

  @Override
  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_transformation, ObjectId id_step ) throws KettleException {
    try {
      rep.saveStepAttribute( id_transformation, id_step, "processfield", processfield );
      rep.saveStepAttribute( id_transformation, id_step, "resultfieldname", resultfieldname );
      rep.saveStepAttribute( id_transformation, id_step, "errorfieldname", errorfieldname );
      rep.saveStepAttribute( id_transformation, id_step, "exitvaluefieldname", exitvaluefieldname );
      rep.saveStepAttribute( id_transformation, id_step, "failwhennotsuccess", failwhennotsuccess );
      rep.saveStepAttribute( id_transformation, id_step, "outputlinedelimiter", outputLineDelimiter );
      rep.saveStepAttribute( id_transformation, id_step, "argumentsInFields", argumentsInFields );
      for ( int i = 0; i < argumentFieldNames.length; i++ ) {
        rep.saveStepAttribute( id_transformation, id_step, i, "argumentFieldName", argumentFieldNames[i] );
      }
    } catch ( Exception e ) {
      throw new KettleException( BaseMessages.getString( PKG, "ExecProcessMeta.Exception.UnableToSaveStepInfo" )
        + 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;
    String error_message = "";

    if ( Utils.isEmpty( resultfieldname ) ) {
      error_message = BaseMessages.getString( PKG, "ExecProcessMeta.CheckResult.ResultFieldMissing" );
      cr = new CheckResult( CheckResult.TYPE_RESULT_ERROR, error_message, stepMeta );
    } else {
      error_message = BaseMessages.getString( PKG, "ExecProcessMeta.CheckResult.ResultFieldOK" );
      cr = new CheckResult( CheckResult.TYPE_RESULT_OK, error_message, stepMeta );
    }

View on GitHub (pinned to f3058517a1)