pentaho/pentaho-kettle · error · KettleException

JobEntryZipFile.UnableLoadJobEntryRep

Error message

JobEntryZipFile.UnableLoadJobEntryRep

What it means

JobEntryZipFile.loadRep() throws this KettleException when reading the zip job entry's attributes from the repository fails. The message includes the job entry id and the original KettleException (typically KettleDatabaseException) as cause.

Solutions

  1. Verify repository DB connectivity and that id_jobentry exists in r_jobentry_attribute
  2. Check the cause exception for the underlying SQL/database error
  3. Run repository upgrade scripts for your PDI version
  4. Re-save the job entry in Spoon to repopulate missing attribute rows

Example fix

// before: loading a deleted entry
jobEntry.loadRep( rep, metaStore, deletedId, databases, slaveServers );
// after: verify existence first
if ( rep.getJobEntry( id_jobentry ) == null ) { throw new KettleException( "Job entry not found" ); }
jobEntry.loadRep( rep, metaStore, id_jobentry, databases, slaveServers );
Defensive patterns

Strategy: try-catch

Validate before calling

// verify entry exists before loadRep
ObjectId id = rep.findJobEntryId( entryName, idJob );
if ( id == null ) throw new KettleException( "Job entry not found in repository" );

Try / catch

try {
  jobEntry.loadRep( rep, metaStore, id_jobentry, databases, slaveServers );
} catch ( KettleException e ) {
  logError( "Failed to load zip entry from repo " + id_jobentry + ": " + e.getCause() );
  // retry after reconnect for transient DB errors
}

Prevention

When it happens

Trigger: Calling loadRep against an unavailable/corrupt repository, an invalid id_jobentry, or when rep.getJobEntryAttributeString/Boolean throws a KettleDatabaseException for attributes like 'SpecifyFormat', 'date_time_format', 'stored_source_path_depth'.

Common situations: Repository DB connectivity loss; schema drift after PDI upgrade (missing r_jobentry_attribute columns/rows); loading a deleted entry id; DB permission changes.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/89a19c1ea6416f03. Report an issue: GitHub.

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/job/entries/zipfile/JobEntryZipFile.java:216

      compressionRate = (int) rep.getJobEntryAttributeInteger( id_jobentry, "compressionrate" );
      ifZipFileExists = (int) rep.getJobEntryAttributeInteger( id_jobentry, "ifzipfileexists" );
      afterZip = (int) rep.getJobEntryAttributeInteger( id_jobentry, "afterzip" );
      wildCard = rep.getJobEntryAttributeString( id_jobentry, "wildcard" );
      excludeWildCard = rep.getJobEntryAttributeString( id_jobentry, "wildcardexclude" );
      sourceDirectory = rep.getJobEntryAttributeString( id_jobentry, "sourcedirectory" );
      movetoDirectory = rep.getJobEntryAttributeString( id_jobentry, "movetodirectory" );
      addFileToResult = rep.getJobEntryAttributeBoolean( id_jobentry, "addfiletoresult" );
      isFromPrevious = rep.getJobEntryAttributeBoolean( id_jobentry, "isfromprevious" );
      createParentFolder = rep.getJobEntryAttributeBoolean( id_jobentry, "createparentfolder" );
      addDate = rep.getJobEntryAttributeBoolean( id_jobentry, "adddate" );
      addTime = rep.getJobEntryAttributeBoolean( id_jobentry, "addtime" );
      specifyFormat = rep.getJobEntryAttributeBoolean( id_jobentry, "SpecifyFormat" );
      dateTimeFormat = rep.getJobEntryAttributeString( id_jobentry, "date_time_format" );
      createMoveToDirectory = rep.getJobEntryAttributeBoolean( id_jobentry, "createMoveToDirectory" );
      includingSubFolders = rep.getJobEntryAttributeBoolean( id_jobentry, "include_subfolders" );
      storedSourcePathDepth = rep.getJobEntryAttributeString( id_jobentry, "stored_source_path_depth" );
    } catch ( KettleException dbe ) {
      throw new KettleException( BaseMessages.getString( PKG, "JobEntryZipFile.UnableLoadJobEntryRep", ""
        + id_jobentry ), dbe );
    }
  }

  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_job ) throws KettleException {
    try {
      rep.saveJobEntryAttribute( id_job, getObjectId(), "zipfilename", zipFilename );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "compressionrate", compressionRate );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "ifzipfileexists", ifZipFileExists );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "afterzip", afterZip );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "wildcard", wildCard );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "wildcardexclude", excludeWildCard );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "sourcedirectory", sourceDirectory );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "movetodirectory", movetoDirectory );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "addfiletoresult", addFileToResult );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "isfromprevious", isFromPrevious );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "createparentfolder", createParentFolder );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "addtime", addTime );

View on GitHub (pinned to f3058517a1)