pentaho/pentaho-kettle · error · KettleException
Unable to load [ ]
Error message
Unable to load <friendlyMetaType> [<realMetaName>]
What it means
Thrown by MetaFileLoaderImpl.getMetaForStep when a step executor meta object (e.g. a Trans/Job executor meta referenced by name) cannot be loaded from the repository. The original exception (repository lookup failure, XML parse error, etc.) is wrapped as the cause. It indicates the referenced meta object exists as a reference but could not be materialized from storage.
Solutions
- Verify the referenced meta object exists in the repository at the expected directory and name
- Check repository connectivity and credentials; test by opening the object in Spoon
- Read the wrapped cause exception for the underlying repository/parse error
- As a fallback, ensure the VFS path variant (with extension) of the meta name is valid
Example fix
// before: loading meta by bare name with no directory context
TransExecutorMeta meta = (TransExecutorMeta) loader.getMetaForStep(stepMeta, repo, directory);
// after: resolve and validate the object exists before loading
if (repo == null || !repo.isConnected()) { throw new IllegalStateException("Repository not connected"); }
RepositoryObjectLocated located = repo.getObjectInformation objectId = repo.getObjectId(new StringObjectId(id));
// then load with the resolved objectId/directory Defensive patterns
Strategy: try-catch
Validate before calling
// Verify repository connectivity and object presence before load
if (repository == null || !repository.isConnected()) { throw new IllegalStateException("Repository not connected"); }
boolean exists = repository.getObjectInformation(...) != null; // or repository.exists(metaName, directory)
if (!exists) { throw new KettleException("Meta not found in repo: " + realMetaName); } Type guard
// Java: check loader configuration before use if (metaStore == null || repository == null) return false;
Try / catch
try { meta = loader.getMetaForStep(stepMeta, repository, directory, idContainer); }
catch (KettleException e) { log.error("Failed to load " + realMetaName + ", cause: " + e.getCause(), e); throw e; } Prevention
- Verify referenced transformations/jobs exist in the repo before saving executor steps
- Test repository connectivity before batch loading
- Always inspect the wrapped cause of KettleException
- Keep names/directories of referenced metas in sync after renames
When it happens
Trigger: getMetaForStep is called with a repository connection and the named meta fails to load: repository exception, corrupt/missing object, or an exception during repository read of the executor step's meta.
Common situations: Referenced transformation/job was renamed or deleted from the repository; wrong repository directory; repository connectivity problems (network, credentials); version-control conflicts leaving a dangling reference.
Understand the failure class
Background: "Not found" and "does not exist" errors: why "Task not found", "No such folder", and "Can't find" fire when a lookup comes back empty — this error's family across 14 libraries.
Related errors
- AbsSecurityProvider.ERROR_0002_UNABLE_TO_ACCESS_IS_ALLOWED
- AccessInputMeta.Exception.ErrorReadingRepository
- AddSequenceMeta.Exception.UnableToReadStepInfo
- AddSequenceMeta.Exception.UnableToSaveStepInfo
- AggregateRowsMeta.Exception.UnexpectedErrorWhileReadingStepInfo
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/1c68218dae66f247.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/base/MetaFileLoaderImpl.java:517
theMeta = attemptCacheRead( cacheKey ); //try to get from the cache first
if ( theMeta == null ) {
if ( rep != null ) {
if ( !Utils.isEmpty( realMetaName ) && !Utils.isEmpty( realDirectory ) ) {
realDirectory = r.normalizeSlashes( realDirectory );
RepositoryDirectoryInterface repdir = rep.findDirectory( realDirectory );
if ( repdir != null ) {
try {
// reads the last revision in the repository...
theMeta = isTransMeta() ? (T) rep.loadTransformation( bowl, realMetaName, repdir, null, true, null, tmpSpace )
: (T) rep.loadJob( realMetaName, repdir, null, null, tmpSpace );
if ( theMeta != null ) {
idContainer[ 0 ] = cacheKey;
}
LogChannel.GENERAL.logDetailed( LOADING + friendlyMetaType + FROM_REPOSITORY,
"Executor " + friendlyMetaType + " [" + realMetaName + "] was loaded from the repository" );
} catch ( Exception e ) {
throw new KettleException( "Unable to load " + friendlyMetaType + " [" + realMetaName + "]", e );
}
}
}
// If we couldn't load from repo, try loading from vfs as fallback
if ( theMeta == null ) {
cacheKey = ensureFilePathHasExtension( cacheKey );
theMeta = attemptLoadMeta( bowl, cacheKey, rep, metaStore, null, tmpSpace, idContainer );
LogChannel.GENERAL.logDetailed( LOADING + friendlyMetaType + FROM_REPOSITORY,
friendlyMetaType + " was loaded from XML file [" + cacheKey + "]" );
}
} else {
// rep is null, let's try loading by filename
try {
theMeta = attemptLoadMeta( bowl, cacheKey, rep, metaStore, null, tmpSpace, idContainer );
} catch ( KettleException ke ) {
try {
// add .ktr extension and try again
String extension = isTransMeta() ? Const.STRING_TRANS_DEFAULT_EXT : Const.STRING_JOB_DEFAULT_EXT;View on GitHub (pinned to f3058517a1)