pentaho/pentaho-kettle · error · KettleException

RestMeta.Exception.UnableToSaveStepInfo

RestMeta.Exception.UnableToSaveStepInfo

Error message

RestMeta.Exception.UnableToSaveStepInfo

What it means

RestMeta.saveRep wraps exceptions during saving the step's attributes into a KettleException with this message (note: it concatenates idStep directly). It means the REST step configuration could not be persisted to the Pentaho repository.

Solutions

  1. Check repository connectivity, permissions, and disk space, then retry saving
  2. Review the wrapped cause exception for the underlying DB error
  3. Commit/restart the repository session if a lock is stuck
  4. If saving locally, export the transformation as XML instead
Defensive patterns

Strategy: try-catch

Try / catch

try {
  saveRep(rep, metaStore, idTransformation, idStep);
} catch (KettleException e) {
  logError("Repository save failed for step " + idStep + ": " + e.getCause());
  // fall back to XML export
}

Prevention

When it happens

Trigger: Repository write failure while calling saveStepAttribute — connection loss, read-only repository, constraint violation, or oversized attribute values.

Common situations: Repository database read-only or out of space; user lacks write permission; network drop mid-save; repository lock held by another session.

Related errors


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

Appendix: source

Thrown at plugins/rest/core/src/main/java/org/pentaho/di/trans/steps/rest/RestMeta.java:719

      rep.saveStepAttribute( idTransformation, idStep, TAG_PREEMPTIVE, preemptive );
      for ( int i = 0; i < headerName.length; i++ ) {
        rep.saveStepAttribute( idTransformation, idStep, i, TAG_HEADER_FIELD, headerField[i] );
        rep.saveStepAttribute( idTransformation, idStep, i, TAG_HEADER_NAME, headerName[i] );
      }
      for ( int i = 0; i < parameterField.length; i++ ) {
        rep.saveStepAttribute( idTransformation, idStep, i, TAG_PARAMETER_FIELD, parameterField[i] );
        rep.saveStepAttribute( idTransformation, idStep, i, TAG_PARAMETER_NAME, parameterName[i] );
      }
      for ( int i = 0; i < matrixParameterField.length; i++ ) {
        rep.saveStepAttribute( idTransformation, idStep, i, TAG_MATRIX_PARAMETER_FIELD, matrixParameterField[i] );
        rep.saveStepAttribute( idTransformation, idStep, i, TAG_MATRIX_PARAMETER_NAME, matrixParameterName[i] );
      }
      rep.saveStepAttribute( idTransformation, idStep, TAG_RESULT_NAME, fieldName );
      rep.saveStepAttribute( idTransformation, idStep, TAG_RESULT_CODE, resultCodeFieldName );
      rep.saveStepAttribute( idTransformation, idStep, TAG_RESPONSE_TIME, responseTimeFieldName );
      rep.saveStepAttribute( idTransformation, idStep, TAG_RESPONSE_HEADER, responseHeaderFieldName );
    } catch ( Exception e ) {
      throw new KettleException( BaseMessages.getString( PKG, "RestMeta.Exception.UnableToSaveStepInfo" )
        + idStep, 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;

    // See if we have input streams leading to this step!
    if ( input.length > 0 ) {
      cr =
        new CheckResult( CheckResultInterface.TYPE_RESULT_OK, BaseMessages.getString(
          PKG, "RestMeta.CheckResult.ReceivingInfoFromOtherSteps" ), stepMeta );
    } else {
      cr =
        new CheckResult( CheckResultInterface.TYPE_RESULT_ERROR, BaseMessages.getString(

View on GitHub (pinned to f3058517a1)