pentaho/pentaho-kettle · error · KettleException

WebServiceAvailableMeta.Exception.UnableToSaveStepInfo

Error message

WebServiceAvailableMeta.Exception.UnableToSaveStepInfo

What it means

Thrown by WebServiceAvailableMeta.saveRep() when persisting this step's attributes (urlField, connectTimeOut, readTimeOut, resultfieldname) to a Kettle repository fails. The raw repository exception is wrapped in a KettleException with a localized 'Unable to save step information' message plus the step id. It indicates a repository storage problem, not a step-configuration problem.

Solutions

  1. Check repository database connectivity and reconnect
  2. Verify the user has write permission on R_STEP_ATTRIBUTE
  3. Retry the save; if it persists, save to file (XML) instead of repository
  4. Inspect the wrapped cause exception for the underlying repository error

Example fix

// before
meta.saveRep( rep, transMeta, transformationId, stepId ); // throws KettleException
// after
try {
  meta.saveRep( rep, transMeta, transformationId, stepId );
} catch ( KettleException e ) {
  logError( "Failed to save WebServiceAvailable step info: " + e.getCause(), e );
  // rethrow or fall back to file-based save
}
Defensive patterns

Strategy: try-catch

Validate before calling

// before saveRep
if ( rep == null || !rep.isConnected() ) {
  throw new KettleException( "Repository is not connected; cannot save step info" );
}

Try / catch

try {
  meta.saveRep( rep, transMeta, id_transformation, id_step );
} catch ( KettleException e ) {
  logError( "Repository save failed: " + e.getCause(), e );
  // surface cause to user or fall back to XML export
}

Prevention

When it happens

Trigger: Calling saveRep() on a repository whose connection has dropped, whose tables are read-only, or which throws while executing saveStepAttribute for any of the step's attributes.

Common situations: Saving a transformation to a database repository with an expired DB connection, insufficient permissions on Kettle attribute tables (R_STEP_ATTRIBUTE), network interruption mid-save, or a corrupt/locked repository.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/steps/webserviceavailable/WebServiceAvailableMeta.java:182

    try {
      urlField = rep.getStepAttributeString( id_step, "urlField" );
      connectTimeOut = rep.getStepAttributeString( id_step, "connectTimeOut" );
      readTimeOut = rep.getStepAttributeString( id_step, "readTimeOut" );
      resultfieldname = rep.getStepAttributeString( id_step, "resultfieldname" );
    } catch ( Exception e ) {
      throw new KettleException( BaseMessages.getString(
        PKG, "WebServiceAvailableMeta.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, "urlField", urlField );
      rep.saveStepAttribute( id_transformation, id_step, "connectTimeOut", connectTimeOut );
      rep.saveStepAttribute( id_transformation, id_step, "readTimeOut", readTimeOut );
      rep.saveStepAttribute( id_transformation, id_step, "resultfieldname", resultfieldname );
    } catch ( Exception e ) {
      throw new KettleException( BaseMessages.getString(
        PKG, "WebServiceAvailableMeta.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 = "";

    if ( Utils.isEmpty( resultfieldname ) ) {
      error_message = BaseMessages.getString( PKG, "WebServiceAvailableMeta.CheckResult.ResultFieldMissing" );
      cr = new CheckResult( CheckResult.TYPE_RESULT_ERROR, error_message, stepMeta );
      remarks.add( cr );
    } else {
      error_message = BaseMessages.getString( PKG, "WebServiceAvailableMeta.CheckResult.ResultFieldOK" );
      cr = new CheckResult( CheckResult.TYPE_RESULT_OK, error_message, stepMeta );

View on GitHub (pinned to f3058517a1)