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
JobEntryFTP.loadRep() throws this KettleException when reading the FTP entry's attributes from the Kettle repository fails. Any KettleException from rep.getJobEntryAttributeString(...) is rethrown as "Unable to load job entry of type 'ftp' from the repository for id_jobentry=" + id_jobentry with the cause chained. It indicates the entry's attribute rows cannot be read from r_jobentry_attribute for that id.
Solutions
- Examine the cause for the underlying repository/database error and restore connectivity or fix permissions.
- Verify attribute rows exist for the id_jobentry in r_jobentry_attribute; recreate the entry in Spoon if missing.
- Confirm you are connected to the correct repository where the job was originally saved.
- Re-save the entry with the current plugin version to normalize stored attributes.
Example fix
// before: loading unconditionally
ftpEntry.loadRep( rep, metaStore, id_jobentry, databases, slaveServers );
// after: check existence first
if ( rep.getJobEntry( id_jobentry ) == null ) {
throw new KettleException( "FTP entry " + id_jobentry + " not found in repository" );
}
ftpEntry.loadRep( rep, metaStore, id_jobentry, databases, slaveServers ); Defensive patterns
Strategy: try-catch
Validate before calling
if ( !rep.isConnected() || rep.getJobEntry( id_jobentry ) == null ) {
throw new KettleException( "FTP entry " + id_jobentry + " unavailable in repository" );
} Try / catch
try {
entry.loadRep( rep, metaStore, id_jobentry, databases, slaveServers );
} catch ( KettleException e ) {
log.error( "FTP entry repo load failed: " + e.getCause() );
throw new KettleException( "Check repository connectivity/schema and reload", e );
} Prevention
- Apply repository upgrade scripts after Pentaho upgrades.
- Test the repository connection before loading jobs.
- Confirm you are on the correct repository database for the environment.
- Recreate corrupted entries in Spoon instead of editing repository tables directly.
When it happens
Trigger: Loading an FTP job entry by ObjectId when the repository rows are missing/corrupt, the repository database is unreachable, the query fails due to permissions, or the id_jobentry points to rows of a different entry type/version.
Common situations: Repository schema migration after Pentaho upgrades; manually pruned or corrupted attribute tables; connecting to the wrong repository database; transient DB connectivity failures.
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
- AccessInputMeta.Exception.ErrorReadingRepository
- AddSequenceMeta.Exception.UnableToReadStepInfo
- AggregateRowsMeta.Exception.UnexpectedErrorWhileReadingStepInfo
- AnalyticQueryMeta.Exception.UnexpectedErrorInReadingStepInfo…
- AppendMeta.Exception.UnableToSaveStepInfo
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/f4cd18360b513290.
Report an issue: GitHub.
Appendix: source
Thrown at plugins/get-file-with-ftp/impl/src/main/java/org/pentaho/di/job/entries/ftp/JobEntryFTP.java:419
id_jobentry, "socksproxy_password" ) );
SifFileExists = rep.getJobEntryAttributeString( id_jobentry, "ifFileExists" );
if ( Utils.isEmpty( SifFileExists ) ) {
ifFileExists = ifFileExistsSkip;
} else {
if ( SifFileExists.equals( SifFileExistsCreateUniq ) ) {
ifFileExists = ifFileExistsCreateUniq;
} else if ( SifFileExists.equals( SifFileExistsFail ) ) {
ifFileExists = ifFileExistsFail;
} else {
ifFileExists = ifFileExistsSkip;
}
}
nr_limit = rep.getJobEntryAttributeString( id_jobentry, "nr_limit" );
success_condition =
Const.NVL( rep.getJobEntryAttributeString( id_jobentry, "success_condition" ), SUCCESS_IF_NO_ERRORS );
} 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(), "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(), "targetdirectory", targetDirectory );
rep.saveJobEntryAttribute( id_job, getObjectId(), "wildcard", wildcard );
rep.saveJobEntryAttribute( id_job, getObjectId(), "binary", binaryMode );
rep.saveJobEntryAttribute( id_job, getObjectId(), "timeout", timeout );
rep.saveJobEntryAttribute( id_job, getObjectId(), "remove", remove );
rep.saveJobEntryAttribute( id_job, getObjectId(), "only_new", onlyGettingNewFiles );View on GitHub (pinned to f3058517a1)