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
- Check repository DB health (connectivity, privileges, disk space) and the cause KettleDatabaseException
- Retry the save after resolving concurrent-edit locks
- Update the repository schema to match your PDI version
- 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
- Save the job itself before saving entries so ObjectIds exist
- Commit repository transactions promptly to avoid lock timeouts
- Keep repository schema and DB credentials current
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
- Edi2Xml.Exception.UnableToSaveStepInfoToRepository
- error reading step with id_step=
- JobEntryZipFile.UnableLoadJobEntryRep
- ScriptMeta.Exception.UnableToSaveStepInfo
- ScriptMeta.Exception.UnexpectedErrorInReadingStepInfo
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)