pentaho/pentaho-kettle · error · KettleException

Unable to save job entry of type 'special' to the…

Error message

Unable to save job entry of type 'special' to the repository with id_job=

What it means

KettleException thrown by JobEntrySpecial.saveRep when persisting the 'special' job entry's schedule attributes (intervalMinutes, hour, minutes, weekDay, dayOfMonth) to the repository fails with a KettleDatabaseException. The message includes id_job so the failed save can be traced back to the specific job.

Solutions

  1. Check the wrapped KettleDatabaseException cause for the underlying SQL error.
  2. Verify the repository database is writable and has free space.
  3. Reconnect to the repository and retry saving the job.
  4. Confirm the repository schema matches the Pentaho/Kettle version (run upgrade scripts).

Example fix

// before
jobEntrySpecial.saveRep(rep, metaStore, idJob, databases, slaveServers);
// after
try {
  jobEntrySpecial.saveRep(rep, metaStore, idJob, databases, slaveServers);
} catch (KettleException e) {
  logError("Save failed for job " + idJob + ": " + e.getCause(), e);
  throw e;
}
Defensive patterns

Strategy: try-catch

Validate before calling

if (rep == null || idJob == null) throw new IllegalArgumentException("Repository and idJob are required for saveRep");
// verify writability early by performing a small test save if possible

Try / catch

try {
  special.saveRep(rep, metaStore, idJob, databases, slaveServers);
} catch (KettleException e) {
  logError("Save failed for id_job=" + idJob + " cause=" + e.getCause(), e);
}

Prevention

When it happens

Trigger: Calling saveRep for a 'special' job entry when saveJobEntryAttribute fails: repository connection lost, R_JOBENTRY_ATTRIBUTE insert/update violates constraints, read-only database, or getObjectId() refers to a stale/missing row.

Common situations: Repository DB in read-only mode or out of space; saving a job while the repository session expired; concurrent edits causing constraint violations; DB schema not upgraded to the current Kettle version.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/job/entries/special/JobEntrySpecial.java:152

    }
  }

  // Save the attributes of this job entry
  //
  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_job ) throws KettleException {
    try {
      rep.saveJobEntryAttribute( id_job, getObjectId(), "start", start );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "dummy", dummy );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "repeat", repeat );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "schedulerType", schedulerType );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "intervalSeconds", intervalSeconds );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "intervalMinutes", intervalMinutes );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "hour", hour );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "minutes", minutes );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "weekDay", weekDay );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "dayOfMonth", dayOfMonth );
    } catch ( KettleDatabaseException dbe ) {
      throw new KettleException( "Unable to save job entry of type 'special' to the repository with id_job="
        + id_job, dbe );
    }
  }

  public boolean isStart() {
    return start;
  }

  public boolean isDummy() {
    return dummy;
  }

  public Result execute( Result previousResult, int nr ) throws KettleJobException {
    Result result = previousResult;

    if ( isStart() ) {
      try {
        long sleepTime = getNextExecutionTime();

View on GitHub (pinned to f3058517a1)