pentaho/pentaho-kettle · error · KettleException
ERROR_0003
ERROR_0003
Error message
JobEntryPGPVerify.ERROR_0003_Cannot_Save_Job_Entry
What it means
JobEntryPGPVerify.saveRep wraps any KettleDatabaseException thrown while saving the entry's attributes (gpglocation, filename, detachedfilename, useDetachedSignature) into a KettleException with ERROR_0003 'Cannot save job entry' plus the job id. The database error is kept as the cause. It indicates the job entry could not be persisted to the repository.
Solutions
- Check the cause for the SQL-level error and fix the repository DB issue (permissions, space, connectivity)
- Ensure the job entry is inserted first (valid ObjectId) before saving attributes — save the whole job via rep.save(...) rather than calling saveRep on an unsaved entry
- Reconnect and retry the save; remove any partially written rows first
Example fix
// before
entry.saveRep(rep, metaStore, idJob); // may throw ERROR_0003
// after
try {
entry.saveRep(rep, metaStore, idJob);
} catch (KettleException e) {
logError("Cannot save PGP verify entry: " + e.getCause(), e);
// alert user the job changes were not persisted
} Defensive patterns
Strategy: try-catch
Validate before calling
// before saveRep
if (entry.getObjectId() == null) throw new KettleException("Entry not inserted yet; save the job first"); Try / catch
try {
entry.saveRep(rep, metaStore, idJob);
} catch (KettleException e) {
logError("Cannot save PGP verify entry: " + e.getCause(), e);
// retry after restoring DB connection; check for partial writes
} Prevention
- Only call saveRep on entries with a valid (inserted) ObjectId
- Keep repository connections healthy; reconnect on failure before retrying
- Watch DB quotas/permissions in shared repository environments
When it happens
Trigger: Calling saveRep (directly or via saving the job) when a rep.saveJobEntryAttribute call throws KettleDatabaseException: connection failure, constraint violation, read-only DB, or invalid ObjectId (unsaved entry).
Common situations: Repository connection dropped mid-save; saving an entry whose ObjectId is null/not yet inserted; database quota or permissions problems; schema mismatch after upgrade.
Related errors
- AddSequenceMeta.Exception.UnableToSaveStepInfo
- InsertUpdateMeta.Exception.UnableToSaveStepInfoToRepository
- JobEntryMSAccessBulkLoad.Meta.UnableSave
- JobPGPEncryptFiles.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/f49baf0e2329519c.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/job/entries/pgpverify/JobEntryPGPVerify.java:130
try {
gpglocation = rep.getJobEntryAttributeString( id_jobentry, "gpglocation" );
filename = rep.getJobEntryAttributeString( id_jobentry, "filename" );
detachedfilename = rep.getJobEntryAttributeString( id_jobentry, "detachedfilename" );
useDetachedSignature = rep.getJobEntryAttributeBoolean( id_jobentry, "useDetachedSignature" );
} catch ( KettleException dbe ) {
throw new KettleException( BaseMessages.getString(
PKG, "JobEntryPGPVerify.ERROR_0002_Cannot_Load_Job_From_Repository", 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(), "filename", filename );
rep.saveJobEntryAttribute( id_job, getObjectId(), "detachedfilename", detachedfilename );
rep.saveJobEntryAttribute( id_job, getObjectId(), "useDetachedSignature", useDetachedSignature );
} catch ( KettleDatabaseException dbe ) {
throw new KettleException( BaseMessages.getString(
PKG, "JobEntryPGPVerify.ERROR_0003_Cannot_Save_Job_Entry", id_job ), dbe );
}
}
public void setGPGLocation( String gpglocation ) {
this.gpglocation = gpglocation;
}
public String getGPGLocation() {
return gpglocation;
}
public void setFilename( String filename ) {
this.filename = filename;
}
public String getFilename() {
return filename;View on GitHub (pinned to f3058517a1)