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

  1. Inspect the chained KettleException (dbe) for the root database error.
  2. Verify repository connectivity and that the repository schema matches your Pentaho version (run upgrade scripts).
  3. Confirm the id_jobentry exists in r_jobentry / r_jobentry_attribute; reload the job.
  4. 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

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


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)