pentaho/pentaho-kettle · error · KettleException
Unable to load job entry of type 'ftp' from the repository…
Error message
Unable to load job entry of type 'ftp' from the repository for id_jobentry=
What it means
JobEntryFTPDelete.loadRep reads the job entry's attributes from the repository by id_jobentry. Any KettleException (typically KettleDatabaseException) thrown by repository reads is rethrown with this message plus the offending id_jobentry.
Solutions
- Verify the repository database is reachable and credentials are valid
- Check rows in r_jobentry / r_jobentry_attribute for the given id_jobentry
- Inspect the wrapped `dbe` cause for the SQL error
- Re-save the job entry from Spoon to rebuild its repository rows
Example fix
// before
String port = rep.getJobEntryAttributeString( id_jobentry, "socksproxy_port" );
// after
if ( id_jobentry == null ) {
throw new KettleException( "id_jobentry is null; cannot load FTP-delete entry" );
}
String port = rep.getJobEntryAttributeString( id_jobentry, "socksproxy_port" ); Defensive patterns
Strategy: try-catch
Validate before calling
if ( id_jobentry == null ) throw new KettleException( "id_jobentry is required" );
// optionally verify existence first
if ( rep.getJobEntryAttributeString( id_jobentry, "name" ) == null ) {
log.warn( "No attributes found for id_jobentry=" + id_jobentry );
} Try / catch
try { jobEntry.loadRep( rep, metaStore, id, dbs, slaves ); }
catch ( KettleException ke ) {
log.error( "Repository load failed for id_jobentry=" + id + ": " + ke.getCause() );
} Prevention
- Check repository connectivity before loading jobs
- Avoid orphaning r_jobentry rows during migrations
- Run repository upgrade scripts after Pentaho version changes
When it happens
Trigger: loadRep(rep, metaStore, id_jobentry, ...) when the repository cannot read attributes — the row for id_jobentry is missing, the table is unreachable, or a value cannot be converted.
Common situations: Repository database down or migrated; job entry rows deleted or orphaned; id_jobentry pointing at another plugin's entry; schema drift between Pentaho versions.
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
- Unable to load job entry of type 'FTPPUT' from the…
- 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
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/bf04eecfbad6c86e.
Report an issue: GitHub.
Appendix: source
Thrown at plugins/ftp-delete/impl/src/main/java/org/pentaho/di/job/entries/ftpdelete/JobEntryFTPDelete.java:369
publicpublickey = rep.getJobEntryAttributeBoolean( id_jobentry, "publicpublickey" );
keyFilename = rep.getJobEntryAttributeString( id_jobentry, "keyfilename" );
keyFilePass = rep.getJobEntryAttributeString( id_jobentry, "keyfilepass" );
nr_limit_success = rep.getJobEntryAttributeString( id_jobentry, "nr_limit_success" );
success_condition = rep.getJobEntryAttributeString( id_jobentry, "success_condition" );
FTPSConnectionType =
FTPSConnection.getConnectionTypeByCode( Const.NVL( rep.getJobEntryAttributeString(
id_jobentry, "ftps_connection_type" ), "" ) );
socksProxyHost = rep.getJobEntryAttributeString( id_jobentry, "socksproxy_host" );
socksProxyPort = rep.getJobEntryAttributeString( id_jobentry, "socksproxy_port" );
socksProxyUsername = rep.getJobEntryAttributeString( id_jobentry, "socksproxy_username" );
socksProxyPassword =
Encr.decryptPasswordOptionallyEncrypted( rep.getJobEntryAttributeString(
id_jobentry, "socksproxy_password" ) );
} catch ( KettleException dbe ) {
throw new KettleException( "Unable to load job entry of type 'ftp' 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(), "protocol", protocol );
rep.saveJobEntryAttribute( id_job, getObjectId(), "port", port );
rep.saveJobEntryAttribute( id_job, getObjectId(), "servername", serverName );
rep.saveJobEntryAttribute( id_job, getObjectId(), "username", userName );
rep.saveJobEntryAttribute( id_job, getObjectId(), "password", Encr
.encryptPasswordIfNotUsingVariables( password ) );
rep.saveJobEntryAttribute( id_job, getObjectId(), "ftpdirectory", ftpDirectory );
rep.saveJobEntryAttribute( id_job, getObjectId(), "wildcard", wildcard );
rep.saveJobEntryAttribute( id_job, getObjectId(), "timeout", timeout );
rep.saveJobEntryAttribute( id_job, getObjectId(), "active", activeConnection );
rep.saveJobEntryAttribute( id_job, getObjectId(), "copyprevious", copyprevious );View on GitHub (pinned to f3058517a1)