pentaho/pentaho-kettle · error · KettleException

HTTPMeta.Exception.UnableToSaveStepInfo

HTTPMeta.Exception.UnableToSaveStepInfo

Error message

HTTPMeta.Exception.UnableToSaveStepInfo

What it means

HTTPMeta.saveRep fails while persisting the step's configuration to the repository. Any exception during rep.saveStepAttribute calls is wrapped in KettleException 'HTTPMeta.Exception.UnableToSaveStepInfo' + the step id.

Solutions

  1. Check repository database connectivity and retry the save.
  2. Verify the user has INSERT/UPDATE rights on the repository tables.
  3. Check the DB error in the chained cause (duplicate key, lock timeout) and resolve accordingly.
  4. If using a file repository, confirm write permission on the target directory.

Example fix

// No code fix; operational remedy:
// before: GRANT SELECT ON R_STEP_ATTRIBUTE TO kettle_user;
// after: GRANT SELECT, INSERT, UPDATE, DELETE ON R_STEP_ATTRIBUTE TO kettle_user;
Defensive patterns

Strategy: try-catch

Validate before calling

// check write permissions on repository tables before saving
// SELECT privilege check:
boolean canWrite = rep.getDatabaseMeta().testConnection(); // plus DB-level INSERT/UPDATE grants

Try / catch

try { saveRep( rep, metaStore, id_transformation, id_step ); } catch ( KettleException e ) {
  logError( "Save to repository failed for step " + id_step + ": " + e.getMessage(), e );
  // export to file as fallback so work is not lost
}

Prevention

When it happens

Trigger: saveRep throws while saving url, header, query parameter, or result field attributes for id_step — repository connection lost, transaction/lock conflict, read-only repository, or table constraint failure.

Common situations: Repository DB down or network blip while saving; insufficient database permissions (INSERT/UPDATE on R_STEP_ATTRIBUTE); save triggered by CI/CD job with a read-only account.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/steps/http/HTTPMeta.java:511

      rep.saveStepAttribute( id_transformation, id_step, "connectionTimeout", connectionTimeout );
      rep.saveStepAttribute( id_transformation, id_step, "closeIdleConnectionsTime", closeIdleConnectionsTime );

      for ( int i = 0; i < argumentField.length; i++ ) {
        rep.saveStepAttribute( id_transformation, id_step, i, "arg_name", argumentField[i] );
        rep.saveStepAttribute( id_transformation, id_step, i, "arg_parameter", argumentParameter[i] );
      }

      for ( int i = 0; i < headerField.length; i++ ) {
        rep.saveStepAttribute( id_transformation, id_step, i, "header_name", headerField[i] );
        rep.saveStepAttribute( id_transformation, id_step, i, "header_parameter", headerParameter[i] );
      }

      rep.saveStepAttribute( id_transformation, id_step, "result_name", fieldName );
      rep.saveStepAttribute( id_transformation, id_step, "result_code", resultCodeFieldName );
      rep.saveStepAttribute( id_transformation, id_step, "response_time", responseTimeFieldName );
      rep.saveStepAttribute( id_transformation, id_step, "response_header", responseHeaderFieldName );
    } catch ( Exception e ) {
      throw new KettleException( BaseMessages.getString( PKG, "HTTPMeta.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;

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

View on GitHub (pinned to f3058517a1)