pentaho/pentaho-kettle · error · KettleException
JobFoldersCompare.Meta.UnableSaveRep
Error message
JobFoldersCompare.Meta.UnableSaveRep
What it means
Thrown by JobEntryFoldersCompare.saveRep when persisting the entry's attributes (compareonly, wildcard, filename1, filename2) fails with a KettleDatabaseException. The message is a localized bundle key formatted with id_job and the cause's message. It means the 'Compare Folders' entry state could not be saved to the repository.
Solutions
- Read dbe.getMessage() in the wrapped exception for the root SQL error and fix the repository DB issue.
- Confirm write permissions on the repository tables for the connecting user.
- Retry the save after restoring connectivity; alternatively save the job as XML.
- Check for DB locks or quota issues on the repository host.
Example fix
// before
entry.saveRep(rep, metaStore, idJob);
// after
try {
entry.saveRep(rep, metaStore, idJob);
} catch (KettleException e) {
logError("FoldersCompare save failed: " + e.getMessage());
// check repository connection, retry
} Defensive patterns
Strategy: try-catch
Validate before calling
// check write access before saving
if (!rep.getConnection().isReadOnly() == false) {
throw new KettleException("Repository is read-only");
} Try / catch
try {
entry.saveRep(rep, metaStore, idJob);
} catch (KettleException e) {
logError("Save failed: " + e.getMessage());
// inspect SQL cause, fix DB, then retry
} Prevention
- Grant INSERT/UPDATE rights on repository tables to the integration user.
- Watch for DB quota and lock issues during batch saves.
- Test repository writes after every schema upgrade.
- Fall back to XML export when the repository is unavailable.
When it happens
Trigger: Calling saveRep on JobEntryFoldersCompare when rep.saveJobEntryAttribute throws KettleDatabaseException — DB down, constraint violation, read-only repository, transaction failure while saving the job.
Common situations: Repository database connection dropped mid-save; storage quota exceeded; saving with insufficient DB permissions; upgrade-induced schema mismatch on r_jobentry_attribute.
Related errors
- JobEntryMSAccessBulkLoad.Meta.UnableSave
- JobEntrySimple.Error.Exception.UnableLoadRep
- JobFoldersCompare.Meta.UnableLoadRep
- JobMoveFiles.Error.Exception.UnableSaveRep
- JobXMLWellFormed.Error.Exception.UnableSaveRep + id_job
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/5da90fcbe15fa819.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/job/entries/folderscompare/JobEntryFoldersCompare.java:171
filename2 = rep.getJobEntryAttributeString( id_jobentry, "filename2" );
} catch ( KettleException dbe ) {
throw new KettleException( BaseMessages.getString( PKG, "JobFoldersCompare.Meta.UnableLoadRep", ""
+ id_jobentry, dbe.getMessage() ) );
}
}
public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_job ) throws KettleException {
try {
rep.saveJobEntryAttribute( id_job, getObjectId(), "include_subfolders", includesubfolders );
rep.saveJobEntryAttribute( id_job, getObjectId(), "compare_filecontent", comparefilecontent );
rep.saveJobEntryAttribute( id_job, getObjectId(), "compare_filesize", comparefilesize );
rep.saveJobEntryAttribute( id_job, getObjectId(), "compareonly", compareonly );
rep.saveJobEntryAttribute( id_job, getObjectId(), "wildcard", wildcard );
rep.saveJobEntryAttribute( id_job, getObjectId(), "filename1", filename1 );
rep.saveJobEntryAttribute( id_job, getObjectId(), "filename2", filename2 );
} catch ( KettleDatabaseException dbe ) {
throw new KettleException( BaseMessages.getString(
PKG, "JobFoldersCompare.Meta.UnableSaveRep", "" + id_job, dbe.getMessage() ) );
}
}
public void setIncludeSubfolders( boolean includeSubfolders ) {
this.includesubfolders = includeSubfolders;
}
public boolean isIncludeSubfolders() {
return includesubfolders;
}
public void setCompareFileContent( boolean comparefilecontent ) {
this.comparefilecontent = comparefilecontent;
}
public boolean isCompareFileContent() {
return comparefilecontent;View on GitHub (pinned to f3058517a1)