pentaho/pentaho-kettle · error · KettleException

JobEntryDelay.UnableToSaveToRepo.Label

Error message

JobEntryDelay.UnableToSaveToRepo.Label

What it means

JobEntryDelay.saveRep throws this localized KettleException when the repository throws KettleDatabaseException while saving maximumTimeout and scaletime attributes for id_job. The cause is chained for diagnosis. It means the Delay entry's configuration was not persisted.

Solutions

  1. Inspect e.getCause() (KettleDatabaseException) for the SQL failure
  2. Verify repository write privileges and database health
  3. Ensure the entry belongs to a persisted job with a valid ObjectId
  4. Retry the save once connectivity is restored

Example fix

// before
entry.saveRep(rep, metaStore, idJob);
// after
try {
  entry.saveRep(rep, metaStore, idJob);
} catch (KettleException e) {
  logError("Delay save failed: " + (e.getCause() != null ? e.getCause().getMessage() : e.getMessage()));
  throw e;
}
Defensive patterns

Strategy: try-catch

Validate before calling

// before saveRep
if (rep.isReadOnly()) throw new IllegalStateException("Repository is read-only");
if (entry.getObjectId() == null) throw new IllegalStateException("Entry must be assigned a valid ObjectId before save");

Try / catch

try {
  entry.saveRep(rep, metaStore, idJob);
} catch (KettleException e) {
  log.error("JobEntryDelay save failed (id_job=" + idJob + ")", e.getCause());
  if (e.getCause() instanceof KettleDatabaseException) {
    // check privileges/disk/connection, then retry
  }
  throw e;
}

Prevention

When it happens

Trigger: saveRep called when saveJobEntryAttribute fails — repository write failure, constraint/privilege violation, null or invalid ObjectId on the job entry, or repository connection lost during save.

Common situations: Read-only repository credentials; DB out of disk or under lock; saving an in-memory-only entry with null ObjectId; transient DB outage mid-save.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/job/entries/delay/JobEntryDelay.java:114

    try {
      maximumTimeout = rep.getJobEntryAttributeString( id_jobentry, "maximumTimeout" );
      scaleTime = (int) rep.getJobEntryAttributeInteger( id_jobentry, "scaletime" );
    } catch ( KettleDatabaseException dbe ) {
      throw new KettleException( BaseMessages.getString( PKG, "JobEntryDelay.UnableToLoadFromRepo.Label" )
        + id_jobentry, dbe );
    }
  }

  //
  // Save the attributes of this job entry
  //
  @Override
  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_job ) throws KettleException {
    try {
      rep.saveJobEntryAttribute( id_job, getObjectId(), "maximumTimeout", maximumTimeout );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "scaletime", scaleTime );
    } catch ( KettleDatabaseException dbe ) {
      throw new KettleException(
        BaseMessages.getString( PKG, "JobEntryDelay.UnableToSaveToRepo.Label" ) + id_job, dbe );
    }
  }

  /**
   * Execute this job entry and return the result. In this case it means, just set the result boolean in the Result
   * class.
   *
   * @param previousResult
   *          The result of the previous execution
   * @return The Result of the execution.
   */
  @Override
  public Result execute( Result previousResult, int nr ) {
    Result result = previousResult;
    result.setResult( false );
    int multiple;
    String waitScale;

View on GitHub (pinned to f3058517a1)