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

  1. Check the cause for the SQL-level error and fix the repository DB issue (permissions, space, connectivity)
  2. 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
  3. 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

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


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)