pentaho/pentaho-kettle · error · KettleException

NormaliserMeta.Exception.UnableToSaveStepInfoToRepository

NormaliserMeta.Exception.UnableToSaveStepInfoToRepository

Error message

NormaliserMeta.Exception.UnableToSaveStepInfoToRepository

What it means

NormaliserMeta.saveRep() persists the Normaliser step's field rows to the repository via rep.saveStepAttribute(...). Any exception during those writes is wrapped in a KettleException with this message plus the id_step, chaining the original cause.

Solutions

  1. Inspect the chained cause (getCause()) for the concrete repository/database error.
  2. Verify repository connectivity and that the user has write privileges.
  3. Retry the save of the transformation after the repository is healthy.
  4. Check repository schema version matches your Pentaho version; run upgrade scripts if needed.

Example fix

null
Defensive patterns

Strategy: retry

Validate before calling

// Verify write access before saving
// e.g. attempt a benign metadata write or check repository permissions

Try / catch

try { meta.saveRep(rep, metaStore, transId, stepId); } catch (KettleException e) { log.error("Repository save failed for step " + stepId + ": " + e.getCause(), e); /* retry with backoff or surface to user */ }

Prevention

When it happens

Trigger: Calling saveRep(rep, metaStore, id_transformation, id_step) when a saveStepAttribute call fails — repository DB write error, connection drop, read-only repository, or constraint violation.

Common situations: Repository database disk full or offline; user lacks write permission on the repository; saving during a network outage; repository schema mismatch after an upgrade.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/steps/normaliser/NormaliserMeta.java:300

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

  @Override
  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_transformation, ObjectId id_step )
    throws KettleException {
    try {
      rep.saveStepAttribute( id_transformation, id_step, "typefield", typeField );

      for ( int i = 0; i < normaliserFields.length; i++ ) {
        rep.saveStepAttribute( id_transformation, id_step, i, "field_name", normaliserFields[i].getName() );
        rep.saveStepAttribute( id_transformation, id_step, i, "field_value", normaliserFields[i].getValue() );
        rep.saveStepAttribute( id_transformation, id_step, i, "field_norm", normaliserFields[i].getNorm() );
      }
    } catch ( Exception e ) {
      throw new KettleException( BaseMessages.getString( PKG,
          "NormaliserMeta.Exception.UnableToSaveStepInfoToRepository" ) + 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 ) {

    String error_message = "";
    CheckResult cr;

    // Look up fields in the input stream <prev>
    if ( prev != null && prev.size() > 0 ) {
      cr =
          new CheckResult( CheckResult.TYPE_RESULT_OK, BaseMessages.getString( PKG,
              "NormaliserMeta.CheckResult.StepReceivingFieldsOK", prev.size() + "" ), stepMeta );
      remarks.add( cr );

View on GitHub (pinned to f3058517a1)