pentaho/pentaho-kettle · error · KettleException

Unable to load job entry of type 'create Folder' from the…

Error message

Unable to load job entry of type 'create Folder' from the repository for id_jobentry=${id_jobentry}

What it means

Kettle wraps any KettleDatabaseException thrown while reading a 'create Folder' job entry's attributes (foldername, fail_of_folder_exists) from the repository in this KettleException. It preserves the underlying cause, so the real repository/database error is chained as the cause. It is a load-path failure in JobEntryCreateFolder.loadRep.

Solutions

  1. Check the chained cause (KettleException.getCause()) for the actual database error
  2. Verify repository connectivity and that id_jobentry exists in r_jobentry / r_jobentry_attribute
  3. Recreate the job entry in the repository (re-save the job) to regenerate its attributes
  4. If upgrading, run the repository upgrade scripts so the attribute table matches your Pentaho version

Example fix

// before
jobEntry.loadRep(rep, metaStore, idJobEntry, databases, slaveServers);
// after
try {
  jobEntry.loadRep(rep, metaStore, idJobEntry, databases, slaveServers);
} catch (KettleException e) {
  logError("Repo load failed for id_jobentry=" + idJobEntry + ": " + (e.getCause() != null ? e.getCause().getMessage() : e.getMessage()));
  throw e;
}
Defensive patterns

Strategy: try-catch

Validate before calling

// before loadRep
if (rep == null || id_jobentry == null) throw new IllegalArgumentException("Repository and id_jobentry required");
if (!rep.isConnected()) throw new IllegalStateException("Repository not connected");

Type guard

boolean isLoadFailure(KettleException e) {
  return e.getMessage() != null && e.getMessage().contains("Unable to load job entry");
}

Try / catch

try {
  jobEntry.loadRep(rep, metaStore, idJobEntry, databases, slaveServers);
} catch (KettleException e) {
  Throwable cause = e.getCause();
  log.error("JobEntryCreateFolder load failed for id_jobentry=" + idJobEntry, cause);
  if (cause instanceof KettleDatabaseException) {
    // check repository connectivity / row existence, then retry or recreate entry
  }
  throw e;
}

Prevention

When it happens

Trigger: Calling JobEntryCreateFolder.loadRep with a repository that throws KettleDatabaseException on getJobEntryAttributeString/getJobEntryAttributeBoolean for the given id_jobentry — e.g. the row for that job entry id no longer exists, the repository connection is broken, or the r_jobentry_attribute table is missing/corrupt.

Common situations: Repository database was restored/migrated and job entry rows were lost; network drop to the repository DB mid-load; opening a job saved by a newer Pentaho version whose schema changed; shared repository metadata (metastore) is inaccessible.

Understand the failure class

Background: Database query failed: Internal Server Error 500s wrapping SQL, Prisma, and connection failures — what to check first — this error's family across 16 libraries.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/job/entries/createfolder/JobEntryCreateFolder.java:105

  public void loadXML( Node entrynode, List<DatabaseMeta> databases, List<SlaveServer> slaveServers,
    Repository rep, IMetaStore metaStore ) throws KettleXMLException {
    try {
      super.loadXML( entrynode, databases, slaveServers );
      foldername = XMLHandler.getTagValue( entrynode, "foldername" );
      failOfFolderExists = "Y".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, "fail_of_folder_exists" ) );
    } catch ( KettleXMLException xe ) {
      throw new KettleXMLException( "Unable to load job entry of type 'create folder' from XML node", xe );
    }
  }

  public void loadRep( Repository rep, IMetaStore metaStore, ObjectId id_jobentry, List<DatabaseMeta> databases,
    List<SlaveServer> slaveServers ) throws KettleException {
    try {
      foldername = rep.getJobEntryAttributeString( id_jobentry, "foldername" );
      failOfFolderExists = rep.getJobEntryAttributeBoolean( id_jobentry, "fail_of_folder_exists" );
    } catch ( KettleException dbe ) {
      throw new KettleException(
        "Unable to load job entry of type 'create Folder' from the repository for id_jobentry=" + id_jobentry,
        dbe );
    }
  }

  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_job ) throws KettleException {
    try {
      rep.saveJobEntryAttribute( id_job, getObjectId(), "foldername", foldername );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "fail_of_folder_exists", failOfFolderExists );
    } catch ( KettleDatabaseException dbe ) {
      throw new KettleException( "Unable to save job entry of type 'create Folder' to the repository for id_job="
        + id_job, dbe );
    }
  }

  public void setFoldername( String foldername ) {
    this.foldername = foldername;
  }

View on GitHub (pinned to f3058517a1)