{"record":{"id":"c894a987040829a1","repo":"pentaho/pentaho-kettle","slug":"sshmeta-exception-unabletosavestepinfo","errorCode":null,"errorMessage":"SSHMeta.Exception.UnableToSaveStepInfo","messagePattern":"SSHMeta\\.Exception\\.UnableToSaveStepInfo","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/trans/steps/ssh/SSHMeta.java","lineNumber":486,"sourceCode":"      rep.saveStepAttribute( idTransformation, idStep, ATTR_USER_NAME, userName );\n      rep.saveStepAttribute( idTransformation, idStep, ATTR_PASSWORD, Encr\n        .encryptPasswordIfNotUsingVariables( password ) );\n\n      rep.saveStepAttribute( idTransformation, idStep, ATTR_USE_PRIVATE_KEY, usePrivateKey );\n      rep.saveStepAttribute( idTransformation, idStep, ATTR_KEY_FILE_NAME, keyFileName );\n      rep.saveStepAttribute( idTransformation, idStep, ATTR_PASS_PHRASE, Encr\n        .encryptPasswordIfNotUsingVariables( passPhrase ) );\n      rep.saveStepAttribute( idTransformation, idStep, ATTR_STD_OUT_FIELD_NAME, stdOutFieldName );\n      rep.saveStepAttribute( idTransformation, idStep, ATTR_STD_ERR_FIELD_NAME, stdErrFieldName );\n      rep.saveStepAttribute( idTransformation, idStep, ATTR_TIME_OUT, timeOut );\n      rep.saveStepAttribute( idTransformation, idStep, ATTR_PROXY_HOST, proxyHost );\n      rep.saveStepAttribute( idTransformation, idStep, ATTR_PROXY_PORT, proxyPort );\n      rep.saveStepAttribute( idTransformation, idStep, ATTR_PROXY_USERNAME, proxyUsername );\n      rep.saveStepAttribute( idTransformation, idStep, ATTR_PROXY_PASSWORD, Encr\n        .encryptPasswordIfNotUsingVariables( proxyPassword ) );\n\n    } catch ( Exception e ) {\n      throw new KettleException(\n        BaseMessages.getString( PKG, \"SSHMeta.Exception.UnableToSaveStepInfo\" ) + idStep, e );\n    }\n  }\n\n  @Override\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\n    CheckResult cr;\n    String errorMessage = \"\";\n\n    // Target hostname\n    if ( Utils.isEmpty( getServerName() ) ) {\n      errorMessage = BaseMessages.getString( PKG, \"SSHMeta.CheckResult.TargetHostMissing\" );\n      cr = new CheckResult( CheckResultInterface.TYPE_RESULT_ERROR, errorMessage, stepMeta );\n      remarks.add( cr );\n    } else {","sourceCodeStart":468,"sourceCodeEnd":504,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/trans/steps/ssh/SSHMeta.java#L468-L504","documentation":"SSHMeta.Exception.UnableToSaveStepInfo is thrown when persisting SSH step settings to a repository (saveRep). Any failure saving a step attribute (or encrypting the proxy password) is wrapped in a KettleException with this message plus the step id. It means the transformation could not be saved with current settings.","triggerScenarios":"Repository insert/update failing during saveStepAttribute (connection loss, constraint violation, permissions), or Encr.encryptPasswordIfNotUsingVariables throwing on bad input.","commonSituations":"Repository database down or read-only; user lacks write permission; repository schema out of date; network interruption during save.","solutions":["Check repository connectivity and that it is not read-only","Confirm the repository user has write permissions on transformation tables","Upgrade the repository schema (r_ tables) to match the Pentaho version","Retry the save after fixing the wrapped cause exception"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"if (rep == null || !rep.isConnected()) {\n  throw new IllegalStateException(\"Repository not connected before save\");\n}","typeGuard":null,"tryCatchPattern":"try {\n  transMeta.save(rep, \"comment\");\n} catch (KettleException e) {\n  logError(\"Save failed for step \" + e.getMessage() + \": \" + e.getCause());\n  exportToXmlAsFallback();\n}","preventionTips":["Ensure repository is writable and not in read-only/maintenance mode","Grant write permissions to the ETL service account","Keep repository backup schedule for recovery"],"tags":["repository","serialization","persistence"],"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"}