pentaho/pentaho-kettle · error · KettleException

Unable to save job entry of type 'shell' to the repository

Error message

Unable to save job entry of type 'shell' to the repository

What it means

JobEntryShell.saveRep persists the job entry to the repository; a KettleDatabaseException while saving attributes (including each argument row via saveJobEntryAttribute) is wrapped in KettleException('Unable to save job entry of type 'shell' to the repository'). The job is not saved and the transaction typically rolls back.

Solutions

  1. Check the nested KettleDatabaseException for the underlying SQL error
  2. Verify repository DB connectivity, credentials, and that it is not read-only
  3. Shorten oversized arguments (or widen the repository VALUE column)
  4. Retry the save; resolve locks/timeouts if the DB was under load
Defensive patterns

Strategy: try-catch

Try / catch

try {
  jobEntryShell.saveRep(rep, metaStore, idJob);
} catch (KettleException e) {
  logError("Repository save failed: " + e.getCause().getMessage(), e);
  // surface to user before the job window closes
}

Prevention

When it happens

Trigger: rep.saveJobEntryAttribute(id_job, objectId, i, 'argument', arguments[i]) throws — repository DB unreachable, table lock/timeout, column size exceeded by a long argument, or constraint violation.

Common situations: Repository database down or credentials expired while saving a job in Spoon; argument string longer than the VALUE column size; database in read-only mode; deadlock/timeout under concurrent saves.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/job/entries/shell/JobEntryShell.java:248

      rep.saveJobEntryAttribute( id_job, getObjectId(), "set_logfile", setLogfile );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "set_append_logfile", setAppendLogfile );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "add_date", addDate );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "add_time", addTime );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "logfile", logfile );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "logext", logext );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "loglevel", logFileLevel == null ? LogLevel.NOTHING
        .getCode() : logFileLevel.getCode() );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "insertScript", insertScript );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "script", script );

      // save the arguments...
      if ( arguments != null ) {
        for ( int i = 0; i < arguments.length; i++ ) {
          rep.saveJobEntryAttribute( id_job, getObjectId(), i, "argument", arguments[i] );
        }
      }
    } catch ( KettleDatabaseException dbe ) {
      throw new KettleException( "Unable to save job entry of type 'shell' to the repository", dbe );
    }
  }

  public void clear() {
    super.clear();

    filename = null;
    workDirectory = null;
    arguments = null;
    argFromPrevious = false;
    addDate = false;
    addTime = false;
    logfile = null;
    logext = null;
    setLogfile = false;
    execPerRow = false;
    setAppendLogfile = false;
    insertScript = false;

View on GitHub (pinned to f3058517a1)