{"record":{"id":"598dd4f104658ab2","repo":"pentaho/pentaho-kettle","slug":"unable-to-save-job-entry-of-type-ftp-to-the-repository-for-598dd4","errorCode":null,"errorMessage":"Unable to save job entry of type 'ftp' to the repository for id_job=","messagePattern":"Unable to save job entry of type 'ftp' to the repository for id_job=","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"plugins/get-file-with-ftp/impl/src/main/java/org/pentaho/di/job/entries/ftp/JobEntryFTP.java","lineNumber":468,"sourceCode":"      rep.saveJobEntryAttribute( id_job, getObjectId(), \"isaddresult\", isaddresult );\n      rep.saveJobEntryAttribute( id_job, getObjectId(), \"createmovefolder\", createmovefolder );\n\n      rep.saveJobEntryAttribute( id_job, getObjectId(), \"proxy_host\", proxyHost );\n      rep.saveJobEntryAttribute( id_job, getObjectId(), \"proxy_port\", proxyPort );\n      rep.saveJobEntryAttribute( id_job, getObjectId(), \"proxy_username\", proxyUsername );\n      rep.saveJobEntryAttribute( id_job, getObjectId(), \"proxy_password\", Encr\n        .encryptPasswordIfNotUsingVariables( proxyPassword ) );\n      rep.saveJobEntryAttribute( id_job, getObjectId(), \"socksproxy_host\", socksProxyHost );\n      rep.saveJobEntryAttribute( id_job, getObjectId(), \"socksproxy_port\", socksProxyPort );\n      rep.saveJobEntryAttribute( id_job, getObjectId(), \"socksproxy_username\", socksProxyUsername );\n      rep.saveJobEntryAttribute( id_job, getObjectId(), \"socksproxy_password\", Encr\n        .encryptPasswordIfNotUsingVariables( socksProxyPassword ) );\n      rep.saveJobEntryAttribute( id_job, getObjectId(), \"ifFileExists\", SifFileExists );\n\n      rep.saveJobEntryAttribute( id_job, getObjectId(), \"nr_limit\", nr_limit );\n      rep.saveJobEntryAttribute( id_job, getObjectId(), \"success_condition\", success_condition );\n    } catch ( KettleDatabaseException dbe ) {\n      throw new KettleException(\n        \"Unable to save job entry of type 'ftp' to the repository for id_job=\" + id_job, dbe );\n    }\n  }\n\n  public void setLimit( String nr_limitin ) {\n    this.nr_limit = nr_limitin;\n  }\n\n  public String getLimit() {\n    return nr_limit;\n  }\n\n  public void setSuccessCondition( String success_condition ) {\n    this.success_condition = success_condition;\n  }\n\n  public String getSuccessCondition() {\n    return success_condition;","sourceCodeStart":450,"sourceCodeEnd":486,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/plugins/get-file-with-ftp/impl/src/main/java/org/pentaho/di/job/entries/ftp/JobEntryFTP.java#L450-L486","documentation":"JobEntryFTP.saveRep() persists all FTP job-entry attributes to the Kettle repository. When any saveJobEntryAttribute call throws a KettleDatabaseException, it is wrapped in this KettleException naming the entry type and id_job. The original database exception is attached as the cause.","triggerScenarios":"Calling saveRep on a JobEntryFTP whose repository connection is down, the repository schema lacks the required attribute tables/columns, or a database-level constraint/IO error occurs while writing the FTP entry attributes.","commonSituations":"Repository database offline or networked DB unreachable during save; stale/corrupt repository connection after a long session; migrating repositories across versions with schema drift; permission problems on the repository user.","solutions":["Check the repository database is reachable and the connection is valid before saving","Inspect the cause (KettleDatabaseException) for the underlying SQL error and fix the schema/permissions","Reconnect to the repository (re-login) and retry the save","Verify the repository user has INSERT/UPDATE rights on the job attribute tables"],"exampleFix":"// before\njobEntry.saveRep(rep, metaStore, id_job);\n// after\ntry {\n  jobEntry.saveRep(rep, metaStore, id_job);\n} catch (KettleException e) {\n  logError(\"Repository save failed: \" + e.getCause(), e);\n  rep.disconnect();\n  rep.connect(login, password);\n  jobEntry.saveRep(rep, metaStore, id_job);\n}","handlingStrategy":"try-catch","validationCode":"if (rep == null || !rep.isConnected()) { throw new IllegalStateException(\"Repository not connected before save\"); }","typeGuard":null,"tryCatchPattern":"try { entry.saveRep(rep, metaStore, id_job); } catch (KettleException e) { log.error(\"FTP entry save failed\", e.getCause()); /* reconnect & retry */ }","preventionTips":["Verify repository connectivity before bulk saves","Keep repository schema at the version matching your Pentaho runtime","Grant the repository user write access to job attribute tables","Log the cause chain, not just the wrapper message"],"tags":["database","persistence","repository"],"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"}