pentaho/pentaho-kettle · error · KettleException

PentahoReportingOutputMeta.Exception.UnableToSaveStepInfo

Error message

PentahoReportingOutputMeta.Exception.UnableToSaveStepInfo

What it means

PentahoReportingOutputMeta.saveRep wraps any Exception from repository save calls into a KettleException with message PentahoReportingOutputMeta.Exception.UnableToSaveStepInfo plus the step ObjectId. It means the step's settings (fields, parameters, processor type) could not be persisted to the repository.

Solutions

  1. Check the chained cause: typically a SQL/permission error from the repository
  2. Verify the repository user has write permissions on the transformation/step tables
  3. Test repository connectivity (database up, network reachable) and retry the save
  4. If running against a file repository, check filesystem permissions and disk space
Defensive patterns

Strategy: try-catch

Validate before calling

// check write access before saveRep
if ( !rep.getSessionClient().hasPermission( idTransformation, PermissionType.MODIFY_CONTENT ) ) {
  throw new KettleException( "No write permission on repository" );
}

Try / catch

try {
  meta.saveRep( rep, metaStore, idTransformation, idStep );
} catch ( KettleException e ) {
  logError( "Unable to save step info for " + idStep + ": " + e.getMessage(), e );
  // retry after reconnecting the repository
}

Prevention

When it happens

Trigger: saveRep -> rep.saveStepAttribute(...) throws, then KettleException is thrown with the message concatenated with idStep.

Common situations: Repository database connection lost mid-save; read-only repository user/insufficient permissions on r_step_attribute; repository storage full or table locked.

Related errors


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

Appendix: source

Thrown at plugins/pentaho-reporting/impl/src/main/java/org/pentaho/di/trans/steps/pentahoreporting/PentahoReportingOutputMeta.java:273

      rep.saveStepAttribute( idTransformation, idStep, XML_TAG_INPUT_FILE_FIELD, inputFileField );
      rep.saveStepAttribute( idTransformation, idStep, XML_TAG_OUTPUT_FILE_FIELD, outputFileField );
      rep.saveStepAttribute( idTransformation, idStep, XML_TAG_INPUT_FILE, inputFile );
      rep.saveStepAttribute( idTransformation, idStep, XML_TAG_OUTPUT_FILE, outputFile );
      rep.saveStepAttribute( idTransformation, idStep, XML_TAG_USE_VALUES_FROM_FIELDS, useValuesFromFields );
      rep.saveStepAttribute( idTransformation, idStep, XML_TAG_CREATE_PARENT_FOLDER, createParentFolder );
      List<String> pars = new ArrayList<String>( parameterFieldMap.keySet() );
      Collections.sort( pars );
      for ( int i = 0; i < pars.size(); i++ ) {
        String parameter = pars.get( i );
        String fieldname = parameterFieldMap.get( parameter );
        rep.saveStepAttribute( idTransformation, idStep, i, XML_TAG_PARAMETER + "_" + XML_TAG_NAME, parameter );
        rep.saveStepAttribute( idTransformation, idStep, i, XML_TAG_PARAMETER + "_" + XML_TAG_FIELD, fieldname );
      }

      rep.saveStepAttribute( idTransformation, idStep, XML_TAG_PROCESSOR_TYPE, outputProcessorType.getCode() );

    } catch ( Exception e ) {
      throw new KettleException( BaseMessages.getString(
        PKG, "PentahoReportingOutputMeta.Exception.UnableToSaveStepInfo" )
        + idStep, 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;

    // Check output fields
    if ( prev != null && prev.size() > 0 ) {
      cr =
        new CheckResult(
          CheckResult.TYPE_RESULT_OK, BaseMessages.getString(
            PKG, "PentahoReportingOutputMeta.CheckResult.ReceivingFields", String.valueOf( prev.size() ) ),
          stepMeta );
      remarks.add( cr );

View on GitHub (pinned to f3058517a1)