pentaho/pentaho-kettle · error · KettleException

Error loading job details

Error message

Error loading job details

What it means

JobDelegate.loadJobMetaDetails loads a JobMeta (job metadata) from the Pentaho repository via the unified JCR data node. Any failure while reading the job's root node attributes map (AttributesMapUtil.loadAttributesMap) is wrapped in a KettleException with this message, with the real cause chained.

Solutions

  1. Inspect the chained cause (e.getCause()) to find the real failure (permissions, corrupt node, connection).
  2. Verify the user has read access to the job file in the Pentaho repository.
  3. Re-open/re-export the job in Spoon to repair a corrupt attributes map; if unrepairable, recreate and re-save the job.
  4. Check PUR client/server version compatibility (client plugin vs BA Server version).

Example fix

// before
KettleException e = ...; log.error(e.getMessage());
// after
try { jobMeta = repo.loadJob(id, null); } catch (KettleException e) { log.error("load failed, cause: ", e.getCause()); }
Defensive patterns

Strategy: try-catch

Validate before calling

if (jobId == null) throw new IllegalArgumentException("job id required"); if (!repo.getJobIdListByDirectory(dir).contains(jobId)) throw new IllegalStateException("job not accessible: " + jobId);

Try / catch

try { jobMeta = repo.loadJob(id, null); } catch (KettleException e) { log.error("job load failed: {}", e.getCause() != null ? e.getCause().getMessage() : e.getMessage(), e); throw e; }

Prevention

When it happens

Trigger: Calling repository.loadJob(...) for a job whose data node is corrupt, missing required attributes, unreadable due to permissions, or whose repository (PUR) connection fails mid-read; dataNodeToElement -> loadJobMetaDetails -> AttributesMapUtil.loadAttributesMap throws.

Common situations: Corrupted job files in the BA Server repository; the connected user lacks read permission on the job file; transient ESR/JCR backend errors; repository upgraded to a schema version the client cannot parse.

Understand the failure class

Background: "failed to read file", EACCES, ENOENT and "could not read <path>" errors: when a program can't read a file from disk — this error's family across 49 libraries.

Related errors


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

Appendix: source

Thrown at plugins/pur/core/src/main/java/org/pentaho/di/repository/pur/JobDelegate.java:361

      jobMeta.getJobLogTable().setBatchIdUsed( rootNode.getProperty( PROP_USE_BATCH_ID ).getBoolean() );
      jobMeta.setBatchIdPassed( rootNode.getProperty( PROP_PASS_BATCH_ID ).getBoolean() );
      jobMeta.getJobLogTable().setLogFieldUsed( rootNode.getProperty( PROP_USE_LOGFIELD ).getBoolean() );

      jobMeta.getJobLogTable().setLogSizeLimit( getString( rootNode, PROP_LOG_SIZE_LIMIT ) );

      // Load the logging tables too..
      //
      RepositoryAttributeInterface attributeInterface = new PurRepositoryAttribute( rootNode, jobMeta.getDatabases() );
      for ( LogTableInterface logTable : jobMeta.getLogTables() ) {
        logTable.loadFromRepository( attributeInterface );
      }

      // Load the attributes map
      //
      AttributesMapUtil.loadAttributesMap( rootNode, jobMeta );

    } catch ( Exception e ) {
      throw new KettleException( "Error loading job details", e );
    }
  }

  protected JobEntryInterface readJobEntry( DataNode copyNode, JobMeta jobMeta, List<JobEntryInterface> jobentries )
    throws KettleException {
    try {
      String name = getString( copyNode, PROP_NAME );
      for ( JobEntryInterface entry : jobentries ) {
        if ( entry.getName().equalsIgnoreCase( name ) ) {
          return entry; // already loaded!
        }
      }

      // load the entry from the node
      //
      String typeId = getString( copyNode, PROP_JOBENTRY_TYPE );

      PluginRegistry registry = PluginRegistry.getInstance();

View on GitHub (pinned to f3058517a1)