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
- Check repository database connectivity and retry the save.
- Verify the user has INSERT/UPDATE rights on the repository tables.
- Check the DB error in the chained cause (duplicate key, lock timeout) and resolve accordingly.
- 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
- Grant service accounts INSERT/UPDATE/DELETE on repository tables
- Retry saves after transient DB outages
- Export transformations to file as a backup before large edits
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
- ERROR_0002
- JobEntryEval.UnableToSaveToRepo
- JobEntryEvalTableContent.UnableSaveRep
- JobEntrySimple.Error.Exception.UnableSaveRep
- JobEntryTruncateTables.UnableLoadRep
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)