pentaho/pentaho-kettle · error · KettleException

JobEntryZipFile.UnableSaveJobEntryRep

Error message

JobEntryZipFile.UnableSaveJobEntryRep

What it means

JobEntryZipFile.saveRep() throws this KettleException when saving the zip job entry's attributes to the repository fails with a KettleDatabaseException. The job id is included in the message and the DB exception is the cause.

Solutions

  1. Check repository DB health (connectivity, privileges, disk space) and the cause KettleDatabaseException
  2. Retry the save after resolving concurrent-edit locks
  3. Update the repository schema to match your PDI version
  4. Reconnect to the repository and re-save the job

Example fix

// before: save fails on locked rows
rep.saveJobEntryAttribute( id_job, getObjectId(), "SpecifyFormat", specifyFormat );
// after: retry with backoff
for ( int i = 0; i < 3; i++ ) { try { rep.saveJobEntryAttribute( id_job, getObjectId(), "SpecifyFormat", specifyFormat ); break; } catch ( KettleException e ) { Thread.sleep( 1000L * ( i + 1 ) ); } }
Defensive patterns

Strategy: try-catch

Validate before calling

// pre-check writable repository
if ( rep.isReadOnly() ) throw new KettleException( "Repository is read-only" );
if ( id_job == null || getObjectId() == null ) throw new KettleException( "Save job before entry attributes" );

Try / catch

try {
  jobEntry.saveRep( rep, metaStore, id_job );
} catch ( KettleException e ) {
  logError( "Failed saving zip entry attributes: " + e.getCause(), e );
  // optionally retry with backoff for transient DB issues
}

Prevention

When it happens

Trigger: Calling saveRep when the repository insert/update of attributes ('SpecifyFormat', 'date_time_format', 'createMoveToDirectory', 'include_subfolders', 'stored_source_path_depth') fails: DB down, constraint violation, lock contention, or insufficient privileges.

Common situations: Read-only repository database; lock from a concurrent Spoon session editing the same job; repository schema out of date; DB server disk full.

Related errors


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

Appendix: source

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

      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 );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "adddate", addDate );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "SpecifyFormat", specifyFormat );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "date_time_format", dateTimeFormat );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "createMoveToDirectory", createMoveToDirectory );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "include_subfolders", includingSubFolders );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "stored_source_path_depth", storedSourcePathDepth );
    } catch ( KettleDatabaseException dbe ) {
      throw new KettleException( BaseMessages
        .getString( PKG, "JobEntryZipFile.UnableSaveJobEntryRep", "" + id_job ), dbe );
    }
  }

  private boolean createParentFolder( String filename ) {
    // Only create the parent directory of the zip file, not the file itself
    boolean result = false;
    FileObject parentfolder = null;
    try {
      FileObject zipFileObject = KettleVFS.getInstance( parentJobMeta.getBowl() ).getFileObject( filename, this );
      parentfolder = zipFileObject.getParent();
      if ( parentfolder != null && !parentfolder.exists() ) {
        if ( log.isDetailed() ) {
          logDetailed( BaseMessages.getString( PKG, "JobEntryZipFile.CanNotFindFolder", ""
            + parentfolder.getName() ) );
        }
        parentfolder.createFolder();
        if ( log.isDetailed() ) {

View on GitHub (pinned to f3058517a1)