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
- Inspect the chained cause (e.getCause()) to find the real failure (permissions, corrupt node, connection).
- Verify the user has read access to the job file in the Pentaho repository.
- Re-open/re-export the job in Spoon to repair a corrupt attributes map; if unrepairable, recreate and re-save the job.
- 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
- Always log the chained cause, not just the wrapper message
- Verify repository read permissions before loading
- Keep PUR client plugin and BA Server versions aligned
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
- AbsSecurityProvider.ERROR_0002_UNABLE_TO_ACCESS_IS_ALLOWED
- AddSequenceMeta.Exception.UnableToReadStepInfo
- AddSequenceMeta.Exception.UnableToSaveStepInfo
- File is currently locked by another user for editing
- File is in the Trash. Use Save As.
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)