pentaho/pentaho-kettle · error · KettleException

Unable to verify if the transformation with name

Error message

Unable to verify if the transformation with name [{0}] in directory [{1}] exists

What it means

existsTransMeta() checks whether a transformation name already exists in a repository directory by calling getTransformationID(). If that lookup throws a KettleException (a database-level failure), it is rethrown as a KettleException with the message 'Unable to verify if the transformation with name [{0}] in directory [{1}] exists'. This is an infrastructure failure while probing for name existence, not the answer 'it doesn't exist'.

Solutions

  1. Check e.getCause() for the actual database error and restore repository connectivity first.
  2. Verify the RepositoryDirectory was loaded/saved from the repository (its ObjectId is non-null) before calling exists.
  3. Retry the existence check after reconnecting; wrap in try/catch to treat 'cannot verify' separately from 'not exists'.
  4. Check repository user privileges to read the transformation listing.

Example fix

// before
boolean exists = repository.existsTransMeta(name, dir, RepositoryObjectType.TRANSFORMATION);
// after
boolean exists;
try {
  exists = repository.existsTransMeta(name, dir, RepositoryObjectType.TRANSFORMATION);
} catch (KettleException e) {
  throw new KettleException("Repository unreachable while checking " + name, e);
}
Defensive patterns

Strategy: try-catch

Validate before calling

if (repositoryDirectory == null || repositoryDirectory.getObjectId() == null) {
  throw new KettleException("Directory is not persisted; load it from the repository first");
}

Type guard

boolean dirValid = dir != null && dir.getObjectId() != null;

Try / catch

try {
  exists = repository.existsTransMeta(name, dir, RepositoryObjectType.TRANSFORMATION);
} catch (KettleException e) {
  throw new KettleException("Cannot verify existence (repository issue)", e);
}

Prevention

When it happens

Trigger: repository.existsTransMeta(name, directory, RepositoryObjectType.TRANSFORMATION) when the underlying ID-with-value query fails — repository connection down, invalid directory ObjectId, SQL error, or lock timeout on the transformation table.

Common situations: Saving/importing a transformation while the repository connection has dropped; passing a directory whose ObjectId was never persisted; database permissions issues on the transformation lookup tables.

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/aae81924fb06e42b. Report an issue: GitHub.

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/repository/kdr/delegates/KettleDatabaseRepositoryTransDelegate.java:95

  public RowMetaAndData getTransHop( ObjectId id_trans_hop ) throws KettleException {
    return repository.connectionDelegate.getOneRow(
      quoteTable( KettleDatabaseRepository.TABLE_R_TRANS_HOP ),
      quote( KettleDatabaseRepository.FIELD_TRANS_HOP_ID_TRANS_HOP ), id_trans_hop );
  }

  public RowMetaAndData getTransDependency( ObjectId id_dependency ) throws KettleException {
    return repository.connectionDelegate.getOneRow(
      quoteTable( KettleDatabaseRepository.TABLE_R_DEPENDENCY ),
      quote( KettleDatabaseRepository.FIELD_DEPENDENCY_ID_DEPENDENCY ), id_dependency );
  }

  public boolean existsTransMeta( String name, RepositoryDirectoryInterface repositoryDirectory,
    RepositoryObjectType objectType ) throws KettleException {
    try {
      return ( getTransformationID( name, repositoryDirectory.getObjectId() ) != null );
    } catch ( KettleException e ) {
      throw new KettleException( "Unable to verify if the transformation with name ["
        + name + "] in directory [" + repositoryDirectory + "] exists", e );
    }
  }

  public synchronized ObjectId getTransformationID( String name, ObjectId id_directory ) throws KettleException {
    return repository.connectionDelegate.getIDWithValue(
      quoteTable( KettleDatabaseRepository.TABLE_R_TRANSFORMATION ),
      quote( KettleDatabaseRepository.FIELD_TRANSFORMATION_ID_TRANSFORMATION ),
      quote( KettleDatabaseRepository.FIELD_TRANSFORMATION_NAME ), name,
      quote( KettleDatabaseRepository.FIELD_TRANSFORMATION_ID_DIRECTORY ), id_directory );
  }

  public synchronized ObjectId getTransHopID( ObjectId id_transformation, ObjectId id_step_from,
    ObjectId id_step_to ) throws KettleException {
    String[] lookupkey =
      new String[] {
        quote( KettleDatabaseRepository.FIELD_TRANS_HOP_ID_TRANSFORMATION ),
        quote( KettleDatabaseRepository.FIELD_TRANS_HOP_ID_STEP_FROM ),

View on GitHub (pinned to f3058517a1)