pentaho/pentaho-kettle · error · KettleException
Unable to load job entry of type 'SFTPPUT' from the…
Error message
Unable to load job entry of type 'SFTPPUT' from the repository for id_jobentry=
What it means
JobEntrySFTPPUT.loadRep catches KettleException from repository attribute reads and rethrows 'Unable to load job entry of type SFTPPUT from the repository for id_jobentry=' + id_jobentry, chaining the original exception. It means loading this entry's stored settings from the repository database failed.
Solutions
- Inspect the chained KettleException (dbe) for the root database error.
- Verify repository connectivity and that the repository schema matches your Pentaho version (run upgrade scripts).
- Confirm the id_jobentry exists in r_jobentry / r_jobentry_attribute; reload the job.
- Recreate the SFTP Put job entry if its repository rows are corrupted.
Defensive patterns
Strategy: try-catch
Validate before calling
if ( rep == null || id_jobentry == null ) { throw new IllegalArgumentException("Repository and id_jobentry required before loadRep"); } Try / catch
try { entry.loadRep(rep, metaStore, id_jobentry, databases, slaveServers); } catch (KettleException e) { log.error("SFTPPUT repo load failed for " + id_jobentry, e); } Prevention
- Keep repository schema upgraded to match the Pentaho version.
- Check repository DB health before opening jobs.
- Recreate entries whose repository rows appear corrupted.
When it happens
Trigger: Calling loadRep when rep.getJobEntryAttributeString/Boolean fails: DB connection error, missing r_jobentry_attribute rows for the id, or schema mismatch after an upgrade.
Common situations: Repository database unavailable while opening a job; outdated repository schema; job entry rows removed or corrupted; stale ObjectId referencing deleted rows.
Understand the failure class
Background: Database query failed: Internal Server Error 500s wrapping SQL, Prisma, and connection failures — what to check first — this error's family across 16 libraries.
Related errors
- ERROR_0002_Cannot_Load_Job_From_Repository
- ERROR_0002_Cannot_Load_Job_From_Repository
- ERROR_0002_Unable_To_Load_Job_From_Repository
- JobEntryAbort.UnableToLoadFromRepo.Label
- JobEntryAbort.UnableToSaveToRepo.Label
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/b0e3698fd8862312.
Report an issue: GitHub.
Appendix: source
Thrown at plugins/put-file-sftp/impl/src/main/java/org/pentaho/di/job/entries/sftpput/JobEntrySFTPPUT.java:313
proxyPort = rep.getJobEntryAttributeString( id_jobentry, "proxyPort" );
proxyUsername = rep.getJobEntryAttributeString( id_jobentry, "proxyUsername" );
proxyPassword =
Encr.decryptPasswordOptionallyEncrypted( rep.getJobEntryAttributeString( id_jobentry, "proxyPassword" ) );
createRemoteFolder = rep.getJobEntryAttributeBoolean( id_jobentry, "createRemoteFolder" );
boolean remove = rep.getJobEntryAttributeBoolean( id_jobentry, "remove" );
setAfterFTPS( getAfterSFTPPutByCode( Const.NVL(
rep.getJobEntryAttributeString( id_jobentry, "aftersftpput" ), "" ) ) );
if ( remove && getAfterFTPS() == AFTER_FTPSPUT_NOTHING ) {
setAfterFTPS( AFTER_FTPSPUT_DELETE );
}
destinationfolder = rep.getJobEntryAttributeString( id_jobentry, "destinationfolder" );
createDestinationFolder = rep.getJobEntryAttributeBoolean( id_jobentry, "createdestinationfolder" );
successWhenNoFile = rep.getJobEntryAttributeBoolean( id_jobentry, "successWhenNoFile" );
} catch ( KettleException dbe ) {
throw new KettleException( "Unable to load job entry of type 'SFTPPUT' from the repository for id_jobentry="
+ id_jobentry, dbe );
}
}
public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_job ) throws KettleException {
try {
rep.saveJobEntryAttribute( id_job, getObjectId(), "servername", serverName );
rep.saveJobEntryAttribute( id_job, getObjectId(), "serverport", serverPort );
rep.saveJobEntryAttribute( id_job, getObjectId(), "username", userName );
rep.saveJobEntryAttribute( id_job, getObjectId(), "password", Encr
.encryptPasswordIfNotUsingVariables( password ) );
rep.saveJobEntryAttribute( id_job, getObjectId(), "sftpdirectory", sftpDirectory );
rep.saveJobEntryAttribute( id_job, getObjectId(), "localdirectory", localDirectory );
rep.saveJobEntryAttribute( id_job, getObjectId(), "wildcard", wildcard );
rep.saveJobEntryAttribute( id_job, getObjectId(), "copyprevious", copyprevious );
rep.saveJobEntryAttribute( id_job, getObjectId(), "copypreviousfiles", copypreviousfiles );
rep.saveJobEntryAttribute( id_job, getObjectId(), "addFilenameResut", addFilenameResut );
View on GitHub (pinned to f3058517a1)