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

  1. Verify the referenced meta object exists in the repository at the expected directory and name
  2. Check repository connectivity and credentials; test by opening the object in Spoon
  3. Read the wrapped cause exception for the underlying repository/parse error
  4. 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

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


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)