pentaho/pentaho-kettle · error · KettleException

JobPGPDecryptFiles.Error.Exception.UnableLoadRep

Error message

JobPGPDecryptFiles.Error.Exception.UnableLoadRep

What it means

Thrown by JobEntryPGPDecryptFiles.loadRep when loading the job entry's settings from the Kettle repository fails with a KettleException (KettleDatabaseException base). It wraps the cause and appends the id_jobentry, indicating the PGP decrypt entry could not be read from the repository.

Solutions

  1. Verify repository database connectivity and credentials.
  2. Check R_JOBENTRY_ATTRIBUTE rows exist for this id_jobentry; re-save the entry from Spoon if missing.
  3. Run repository repair/upgrade scripts for your Pentaho version.
  4. Inspect the wrapped cause for the specific SQL error.

Example fix

// before
// (no fallback on load)
// after: default values when attributes are absent
String pass = rep.getJobEntryAttributeString( id_jobentry, "passphrase" );
if ( pass == null ) {
  logBasic( "passphrase attribute missing for entry " + id_jobentry + "; using default" );
  pass = "";
}
Defensive patterns

Strategy: try-catch

Validate before calling

// check repository connectivity before loading jobs
if ( !rep.getConnection().isAutoCommit() ) { /* connectivity test */ }
rep.getJobEntryAttributeString( id_jobentry, "name" ); // probe read

Try / catch

try {
  jobEntry.loadRep( rep, metaStore, id_jobentry, databases, slaveServers );
} catch ( KettleException e ) {
  logError( "Cannot load PGP entry from repository (id=" + id_jobentry + "): " + e.getCause(), e );
  // fall back to defaults or abort job setup
}

Prevention

When it happens

Trigger: rep.getJobEntryAttributeString(id_jobentry, nr, "passphrase"/"destination_filefolder"/"wildcard") throws because the repository database is unreachable, the entry rows are missing, or the repository schema is broken.

Common situations: Repository DB connection failure while opening a job; entry saved by an incompatible plugin version so expected attribute rows don't exist; corrupted R_JOBENTRY_ATTRIBUTE rows; insufficient DB privileges.

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/0367b99fd59413ea. Report an issue: GitHub.

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/job/entries/pgpdecryptfiles/JobEntryPGPDecryptFiles.java:311

      add_moved_time = rep.getJobEntryAttributeBoolean( id_jobentry, "add_moved_time" );
      SpecifyMoveFormat = rep.getJobEntryAttributeBoolean( id_jobentry, "SpecifyMoveFormat" );

      // How many arguments?
      int argnr = rep.countNrJobEntryAttributes( id_jobentry, "source_filefolder" );
      allocate( argnr );

      // Read them all...
      for ( int a = 0; a < argnr; a++ ) {
        source_filefolder[a] = rep.getJobEntryAttributeString( id_jobentry, a, "source_filefolder" );
        passphrase[a] =
          Encr
            .decryptPasswordOptionallyEncrypted( rep.getJobEntryAttributeString( id_jobentry, a, "passphrase" ) );
        destination_filefolder[a] = rep.getJobEntryAttributeString( id_jobentry, a, "destination_filefolder" );
        wildcard[a] = rep.getJobEntryAttributeString( id_jobentry, a, "wildcard" );
      }
    } catch ( KettleException dbe ) {

      throw new KettleException( BaseMessages.getString( PKG, "JobPGPDecryptFiles.Error.Exception.UnableLoadRep" )
        + id_jobentry, dbe );
    }
  }

  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_job ) throws KettleException {
    try {
      rep.saveJobEntryAttribute( id_job, getObjectId(), "gpglocation", gpglocation );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "arg_from_previous", arg_from_previous );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "include_subfolders", include_subfolders );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "add_result_filesname", add_result_filesname );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "destination_is_a_file", destination_is_a_file );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "create_destination_folder", create_destination_folder );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "nr_errors_less_than", nr_errors_less_than );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "success_condition", success_condition );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "add_date", add_date );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "add_time", add_time );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "SpecifyFormat", SpecifyFormat );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "date_time_format", date_time_format );

View on GitHub (pinned to f3058517a1)