pentaho/pentaho-kettle · error · KettleException

ERROR_0003_Cannot_Save_Job_Entry

ERROR_0003_Cannot_Save_Job_Entry

Error message

JobEntryFilesExist.ERROR_0003_Cannot_Save_Job_Entry

What it means

Thrown by JobEntryFilesExist.saveRep when persisting the entry's argument list ('name' attribute per index) to the repository fails. The KettleDatabaseException is wrapped with a localized message containing the job id and dbe.getMessage(), without chaining the cause. The entry's file list was not saved.

Solutions

  1. Check repository DB health and retry the save
  2. Verify write privileges on r_jobentry_attribute
  3. Read dbe.getMessage() (embedded in the thrown message) for the SQL failure
  4. Reduce/verify the argument list and resolve any concurrent sessions
Defensive patterns

Strategy: try-catch

Validate before calling

// Pre-save checks
if (arguments == null || arguments.length == 0) { throw new IllegalStateException("no files configured"); }
if (rep.isReadOnly()) { throw new IllegalStateException("repository read-only"); }

Try / catch

try {
    jobMeta.saveRep(rep, metaStore, id_job);
} catch (KettleException e) {
    logError("Save failed: " + e.getMessage());
    // message embeds dbe.getMessage(); retry or export to XML
}

Prevention

When it happens

Trigger: Calling saveRep during a job save when any rep.saveJobEntryAttribute(id_job, objectId, i, "name", arguments[i]) call throws KettleDatabaseException — connection loss, constraint violation, permissions.

Common situations: Repository DB unavailable during save; too many arguments causing a DB limit/constraint failure; read-only repository credentials; concurrent edit conflict.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/job/entries/filesexist/JobEntryFilesExist.java:160

    } catch ( KettleException dbe ) {
      throw new KettleException( BaseMessages
        .getString( PKG, "JobEntryFilesExist.ERROR_0002_Cannot_Load_Job_From_Repository", "" + id_jobentry, dbe
          .getMessage() ) );
    }
  }

  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_job ) throws KettleException {
    try {
      rep.saveJobEntryAttribute( id_job, getObjectId(), "filename", filename );

      // save the arguments...
      if ( arguments != null ) {
        for ( int i = 0; i < arguments.length; i++ ) {
          rep.saveJobEntryAttribute( id_job, getObjectId(), i, "name", arguments[i] );
        }
      }
    } catch ( KettleDatabaseException dbe ) {
      throw new KettleException( BaseMessages.getString(
        PKG, "JobEntryFilesExist.ERROR_0003_Cannot_Save_Job_Entry", "" + id_job, dbe.getMessage() ) );
    }
  }

  public void setFilename( String filename ) {
    this.filename = filename;
  }

  public String getFilename() {
    return filename;
  }

  public String[] getArguments() {
    return arguments;
  }

  public void setArguments( String[] arguments ) {
    this.arguments = arguments;

View on GitHub (pinned to f3058517a1)