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

  1. Examine the cause for the underlying repository/database error and restore connectivity or fix permissions.
  2. Verify attribute rows exist for the id_jobentry in r_jobentry_attribute; recreate the entry in Spoon if missing.
  3. Confirm you are connected to the correct repository where the job was originally saved.
  4. 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

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


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)