{"record":{"id":"af9cb7688977c267","repo":"pentaho/pentaho-kettle","slug":"webserviceavailablemeta-exception-unabletosavestepinfo","errorCode":null,"errorMessage":"WebServiceAvailableMeta.Exception.UnableToSaveStepInfo","messagePattern":"WebServiceAvailableMeta\\.Exception\\.UnableToSaveStepInfo","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/trans/steps/webserviceavailable/WebServiceAvailableMeta.java","lineNumber":182,"sourceCode":"    try {\n      urlField = rep.getStepAttributeString( id_step, \"urlField\" );\n      connectTimeOut = rep.getStepAttributeString( id_step, \"connectTimeOut\" );\n      readTimeOut = rep.getStepAttributeString( id_step, \"readTimeOut\" );\n      resultfieldname = rep.getStepAttributeString( id_step, \"resultfieldname\" );\n    } catch ( Exception e ) {\n      throw new KettleException( BaseMessages.getString(\n        PKG, \"WebServiceAvailableMeta.Exception.UnexpectedErrorReadingStepInfo\" ), e );\n    }\n  }\n\n  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_transformation, ObjectId id_step ) throws KettleException {\n    try {\n      rep.saveStepAttribute( id_transformation, id_step, \"urlField\", urlField );\n      rep.saveStepAttribute( id_transformation, id_step, \"connectTimeOut\", connectTimeOut );\n      rep.saveStepAttribute( id_transformation, id_step, \"readTimeOut\", readTimeOut );\n      rep.saveStepAttribute( id_transformation, id_step, \"resultfieldname\", resultfieldname );\n    } catch ( Exception e ) {\n      throw new KettleException( BaseMessages.getString(\n        PKG, \"WebServiceAvailableMeta.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    String error_message = \"\";\n\n    if ( Utils.isEmpty( resultfieldname ) ) {\n      error_message = BaseMessages.getString( PKG, \"WebServiceAvailableMeta.CheckResult.ResultFieldMissing\" );\n      cr = new CheckResult( CheckResult.TYPE_RESULT_ERROR, error_message, stepMeta );\n      remarks.add( cr );\n    } else {\n      error_message = BaseMessages.getString( PKG, \"WebServiceAvailableMeta.CheckResult.ResultFieldOK\" );\n      cr = new CheckResult( CheckResult.TYPE_RESULT_OK, error_message, stepMeta );","sourceCodeStart":164,"sourceCodeEnd":200,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/trans/steps/webserviceavailable/WebServiceAvailableMeta.java#L164-L200","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Check repository database connectivity and reconnect","Verify the user has write permission on R_STEP_ATTRIBUTE","Retry the save; if it persists, save to file (XML) instead of repository","Inspect the wrapped cause exception for the underlying repository error"],"exampleFix":"// before\nmeta.saveRep( rep, transMeta, transformationId, stepId ); // throws KettleException\n// after\ntry {\n  meta.saveRep( rep, transMeta, transformationId, stepId );\n} catch ( KettleException e ) {\n  logError( \"Failed to save WebServiceAvailable step info: \" + e.getCause(), e );\n  // rethrow or fall back to file-based save\n}","handlingStrategy":"try-catch","validationCode":"// before saveRep\nif ( rep == null || !rep.isConnected() ) {\n  throw new KettleException( \"Repository is not connected; cannot save step info\" );\n}","typeGuard":null,"tryCatchPattern":"try {\n  meta.saveRep( rep, transMeta, id_transformation, id_step );\n} catch ( KettleException e ) {\n  logError( \"Repository save failed: \" + e.getCause(), e );\n  // surface cause to user or fall back to XML export\n}","preventionTips":["Verify repository connectivity before programmatic saves","Grant write access on R_STEP_ATTRIBUTE tables","Catch KettleException and log e.getCause() for the real repository error","Keep repository DB connections alive / use connection pooling health checks"],"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"}