pentaho/pentaho-kettle · error · KettleException

XsltMeta.Exception.UnableToSaveStepInfo

Error message

XsltMeta.Exception.UnableToSaveStepInfo

What it means

Thrown by XsltMeta.saveRep when an exception occurs while persisting the step's configuration to the repository database. Any saveStepAttribute failure (including the per-index output property rows) is wrapped in a KettleException with the step id appended. The transformation metadata was not fully saved.

Solutions

  1. Check the cause exception and DB connectivity; re-save the transformation after reconnecting
  2. Verify the repository user has write permissions on the attribute tables
  3. Check DB constraints/table space and repository logs for the failing statement
  4. Retry the save; if persistent, export the transformation to XML as a workaround
Defensive patterns

Strategy: try-catch

Try / catch

try {
    transMeta.saveRep(repo, metaStore, transName, transObjectId);
} catch (KettleException e) {
    log.error("Failed to save step info: " + e.getMessage(), e.getCause());
    // export to XML as fallback and retry save after connectivity check
}

Prevention

When it happens

Trigger: Repository write failures during saveRep: DB connection lost, read-only repository, constraint violations, transaction rollback, or oversized attribute values.

Common situations: Saving a transformation while the repository connection dropped; read-only DB user; repository locked by another process; network blips with a remote repository.

Related errors


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

Appendix: source

Thrown at plugins/xml/core/src/main/java/org/pentaho/di/trans/steps/xslt/XsltMeta.java:403

      rep.saveStepAttribute( id_transformation, id_step, "resultfieldname", resultFieldname );

      rep.saveStepAttribute( id_transformation, id_step, "xslfilefield", xslFileField );

      rep.saveStepAttribute( id_transformation, id_step, "xslfilefielduse", xslFileFieldUse );
      rep.saveStepAttribute( id_transformation, id_step, "xslfieldisafile", xslFieldIsAFile );

      rep.saveStepAttribute( id_transformation, id_step, "xslfactory", xslFactory );

      for ( int i = 0; i < parameterName.length; i++ ) {
        rep.saveStepAttribute( id_transformation, id_step, i, "param_field", parameterField[i] );
        rep.saveStepAttribute( id_transformation, id_step, i, "param_name", parameterName[i] );
      }
      for ( int i = 0; i < outputPropertyName.length; i++ ) {
        rep.saveStepAttribute( id_transformation, id_step, i, "output_property_name", outputPropertyName[i] );
        rep.saveStepAttribute( id_transformation, id_step, i, "output_property_value", outputPropertyValue[i] );
      }
    } catch ( Exception e ) {
      throw new KettleException( BaseMessages.getString( PKG, "XsltMeta.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;

    if ( prev != null && prev.size() > 0 ) {
      cr =
          new CheckResult( CheckResult.TYPE_RESULT_OK, BaseMessages.getString( PKG,
              "XsltMeta.CheckResult.ConnectedStepOK", String.valueOf( prev.size() ) ), stepMeta );
      remarks.add( cr );
    } else {
      cr =
          new CheckResult( CheckResult.TYPE_RESULT_ERROR, BaseMessages.getString( PKG,
              "XsltMeta.CheckResult.NoInputReceived" ), stepMeta );
      remarks.add( cr );

View on GitHub (pinned to f3058517a1)