pentaho/pentaho-kettle · error · KettleException

Unable to load job entry of type 'FTPPUT' from the…

Error message

Unable to load job entry of type 'FTPPUT' from the repository for id_jobentry={0}

What it means

JobEntryFTPPUT.loadRep wraps KettleException failures from repository attribute reads and rethrows as 'Unable to load job entry of type FTPPUT from the repository for id_jobentry={0}'. It means one or more getJobEntryAttribute* calls failed while loading this entry's settings from the repository database.

Solutions

  1. Check the chained KettleException (dbe) for the root database error and fix connectivity/schema accordingly.
  2. Verify the repository tables exist and match your Pentaho version (run repository upgrade scripts).
  3. Confirm id_jobentry points to an existing row set; reload the job from the repository.
  4. If rows are corrupted, delete and recreate the FTP Put job entry in the repository.
Defensive patterns

Strategy: try-catch

Validate before calling

boolean exists = rep != null && jobEntryId != null && rep.getJobEntryAttributeString(jobEntryId, "hostname") != null; // probe one attribute first

Try / catch

try { entry.loadRep(rep, metaStore, jobEntryId, databases, slaveServers); } catch (KettleException e) { log.error("FTPPUT repo load failed for " + jobEntryId, e); }

Prevention

When it happens

Trigger: Calling loadRep when the underlying repository query fails: missing r_jobentry_attribute rows, database connectivity loss mid-load, schema mismatch, or corrupted jobEntryId.

Common situations: Repository database schema out of date after upgrade; DB connection dropped while opening a job; job entry rows deleted or corrupted in the repository tables.

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/58a365f472979392. Report an issue: GitHub.

Appendix: source

Thrown at plugins/put-a-file-with-ftp/impl/src/main/java/org/pentaho/di/job/entries/ftpput/JobEntryFTPPUT.java:277

        // put in the encoding used before v 2.4.0
        controlEncoding = LEGACY_CONTROL_ENCODING;
      }

      proxyHost = rep.getJobEntryAttributeString( jobEntryId, XML_TAG_PROXY_HOST );
      proxyPort = rep.getJobEntryAttributeString( jobEntryId, XML_TAG_PROXY_PORT );
      proxyUsername = rep.getJobEntryAttributeString( jobEntryId, XML_TAG_PROXY_USERNAME );
      proxyPassword =
        Encr
          .decryptPasswordOptionallyEncrypted( rep.getJobEntryAttributeString( jobEntryId, XML_TAG_PROXY_PASSWORD ) );
      socksProxyHost = rep.getJobEntryAttributeString( jobEntryId, XML_TAG_SOCKSPROXY_HOST );
      socksProxyPort = rep.getJobEntryAttributeString( jobEntryId, XML_TAG_SOCKSPROXY_PORT );
      socksProxyUsername = rep.getJobEntryAttributeString( jobEntryId, XML_TAG_SOCKSPROXY_USERNAME );
      socksProxyPassword =
        Encr.decryptPasswordOptionallyEncrypted( rep.getJobEntryAttributeString(
          jobEntryId, XML_TAG_SOCKSPROXY_PASSWORD ) );

    } catch ( KettleException dbe ) {
      throw new KettleException( BaseMessages.getString( PKG, "JobFTPPUT.UnableToLoadFromRepo", String
        .valueOf( jobEntryId ) ), dbe );
    }
  }

  @Override
  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId idJob ) throws KettleException {
    try {
      rep.saveJobEntryAttribute( idJob, getObjectId(), XML_TAG_SERVERNAME, serverName );
      rep.saveJobEntryAttribute( idJob, getObjectId(), XML_TAG_SERVERPORT, serverPort );
      rep.saveJobEntryAttribute( idJob, getObjectId(), XML_TAG_USERNAME, userName );
      rep.saveJobEntryAttribute( idJob, getObjectId(), XML_TAG_PASSWORD, Encr
        .encryptPasswordIfNotUsingVariables( password ) );
      rep.saveJobEntryAttribute( idJob, getObjectId(), XML_TAG_REMOTE_DIRECTORY, remoteDirectory );
      rep.saveJobEntryAttribute( idJob, getObjectId(), XML_TAG_LOCAL_DIRECTORY, localDirectory );
      rep.saveJobEntryAttribute( idJob, getObjectId(), XML_TAG_WILDCARD, wildcard );
      rep.saveJobEntryAttribute( idJob, getObjectId(), XML_TAG_BINARY, binaryMode );
      rep.saveJobEntryAttribute( idJob, getObjectId(), XML_TAG_TIMEOUT, timeout );
      rep.saveJobEntryAttribute( idJob, getObjectId(), XML_TAG_REMOVE, remove );

View on GitHub (pinned to f3058517a1)