pentaho/pentaho-kettle · error · KettleException

CreditCardValidatorMeta.Exception.UnableToSaveStepInfo

CreditCardValidatorMeta.Exception.UnableToSaveStepInfo

Error message

CreditCardValidatorMeta.Exception.UnableToSaveStepInfo

What it means

CreditCardValidatorMeta.saveRep persists step settings to a repository via saveStepAttribute calls. Any exception during those writes is wrapped in a KettleException with UnableToSaveStepInfo (concatenated with the step id) and the original cause, indicating the step configuration could not be saved.

Solutions

  1. Check repository connection and write permissions, then retry saving
  2. Save the transformation to a local .ktr file as a fallback
  3. Inspect the chained cause for the underlying repository error

Example fix

// before
rep.saveStepAttribute(idTrans, idStep, "onlydigits", onlydigits); // throws
// after — save to file when repository is unavailable
transMeta.setFilename("local_copy.ktr"); transMeta.writeToFile("local_copy.ktr");
Defensive patterns

Strategy: try-catch

Validate before calling

if (!rep.isConnected()) throw new IllegalStateException("Repository not connected");

Try / catch

try { meta.saveRep(rep, metaStore, idTrans, idStep); } catch (KettleException e) { logError("Save failed (step " + idStep + "): " + e.getCause()); }

Prevention

When it happens

Trigger: Saving a transformation while the repository is read-only, the connection drops, or the repository throws while writing attributes for the given id_step.

Common situations: Database repository with insufficient write permissions; locked tables; network interruption during save; repository schema version mismatch.

Related errors


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

Appendix: source

Thrown at plugins/credit-card-validator/impl/src/main/java/org/pentaho/di/trans/steps/creditcardvalidator/CreditCardValidatorMeta.java:235

      notvalidmsg = rep.getStepAttributeString( id_step, "notvalidmsg" );
      onlydigits = rep.getStepAttributeBoolean( id_step, "onlydigits" );

    } catch ( Exception e ) {
      throw new KettleException( BaseMessages.getString(
        PKG, "CreditCardValidatorMeta.Exception.UnexpectedErrorReadingStepInfo" ), e );
    }
  }

  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_transformation, ObjectId id_step ) throws KettleException {
    try {
      rep.saveStepAttribute( id_transformation, id_step, "fieldname", fieldname );
      rep.saveStepAttribute( id_transformation, id_step, "resultfieldname", resultfieldname );
      rep.saveStepAttribute( id_transformation, id_step, "cardtype", cardtype );
      rep.saveStepAttribute( id_transformation, id_step, "notvalidmsg", notvalidmsg );
      rep.saveStepAttribute( id_transformation, id_step, "onlydigits", onlydigits );

    } catch ( Exception e ) {
      throw new KettleException( BaseMessages.getString(
        PKG, "CreditCardValidatorMeta.Exception.UnableToSaveStepInfo" )
        + id_step, e );
    }
  }

  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 = "";

    String realresultfieldname = transMeta.environmentSubstitute( resultfieldname );
    if ( Utils.isEmpty( realresultfieldname ) ) {
      error_message = BaseMessages.getString( PKG, "CreditCardValidatorMeta.CheckResult.ResultFieldMissing" );
      cr = new CheckResult( CheckResult.TYPE_RESULT_ERROR, error_message, stepMeta );
      remarks.add( cr );
    } else {
      error_message = BaseMessages.getString( PKG, "CreditCardValidatorMeta.CheckResult.ResultFieldOK" );

View on GitHub (pinned to f3058517a1)