{"record":{"id":"69da39b27e3c6054","repo":"pentaho/pentaho-kettle","slug":"httpmeta-exception-unabletosavestepinfo","errorCode":"HTTPMeta.Exception.UnableToSaveStepInfo","errorMessage":"HTTPMeta.Exception.UnableToSaveStepInfo","messagePattern":"HTTPMeta\\.Exception\\.UnableToSaveStepInfo","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/trans/steps/http/HTTPMeta.java","lineNumber":511,"sourceCode":"      rep.saveStepAttribute( id_transformation, id_step, \"connectionTimeout\", connectionTimeout );\n      rep.saveStepAttribute( id_transformation, id_step, \"closeIdleConnectionsTime\", closeIdleConnectionsTime );\n\n      for ( int i = 0; i < argumentField.length; i++ ) {\n        rep.saveStepAttribute( id_transformation, id_step, i, \"arg_name\", argumentField[i] );\n        rep.saveStepAttribute( id_transformation, id_step, i, \"arg_parameter\", argumentParameter[i] );\n      }\n\n      for ( int i = 0; i < headerField.length; i++ ) {\n        rep.saveStepAttribute( id_transformation, id_step, i, \"header_name\", headerField[i] );\n        rep.saveStepAttribute( id_transformation, id_step, i, \"header_parameter\", headerParameter[i] );\n      }\n\n      rep.saveStepAttribute( id_transformation, id_step, \"result_name\", fieldName );\n      rep.saveStepAttribute( id_transformation, id_step, \"result_code\", resultCodeFieldName );\n      rep.saveStepAttribute( id_transformation, id_step, \"response_time\", responseTimeFieldName );\n      rep.saveStepAttribute( id_transformation, id_step, \"response_header\", responseHeaderFieldName );\n    } catch ( Exception e ) {\n      throw new KettleException( BaseMessages.getString( PKG, \"HTTPMeta.Exception.UnableToSaveStepInfo\" )\n        + id_step, e );\n    }\n  }\n\n  public void check( List<CheckResultInterface> remarks, TransMeta transMeta, StepMeta stepMeta,\n    RowMetaInterface prev, String[] input, String[] output, RowMetaInterface info, VariableSpace space,\n    Repository repository, IMetaStore metaStore ) {\n    CheckResult cr;\n\n    // See if we have input streams leading to this step!\n    if ( input.length > 0 ) {\n      cr =\n        new CheckResult( CheckResultInterface.TYPE_RESULT_OK, BaseMessages.getString(\n          PKG, \"HTTPMeta.CheckResult.ReceivingInfoFromOtherSteps\" ), stepMeta );\n      remarks.add( cr );\n    } else {\n      cr =\n        new CheckResult( CheckResultInterface.TYPE_RESULT_ERROR, BaseMessages.getString(","sourceCodeStart":493,"sourceCodeEnd":529,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/trans/steps/http/HTTPMeta.java#L493-L529","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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."],"exampleFix":"// No code fix; operational remedy:\n// before: GRANT SELECT ON R_STEP_ATTRIBUTE TO kettle_user;\n// after: GRANT SELECT, INSERT, UPDATE, DELETE ON R_STEP_ATTRIBUTE TO kettle_user;","handlingStrategy":"try-catch","validationCode":"// check write permissions on repository tables before saving\n// SELECT privilege check:\nboolean canWrite = rep.getDatabaseMeta().testConnection(); // plus DB-level INSERT/UPDATE grants","typeGuard":null,"tryCatchPattern":"try { saveRep( rep, metaStore, id_transformation, id_step ); } catch ( KettleException e ) {\n  logError( \"Save to repository failed for step \" + id_step + \": \" + e.getMessage(), e );\n  // export to file as fallback so work is not lost\n}","preventionTips":["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"],"tags":["kettle","repository","persistence","database"],"backgroundTag":"database-write-failed","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}