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
- Check e.getCause() for the actual database error and restore repository connectivity first.
- Verify the RepositoryDirectory was loaded/saved from the repository (its ObjectId is non-null) before calling exists.
- Retry the existence check after reconnecting; wrap in try/catch to treat 'cannot verify' separately from 'not exists'.
- 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
- Only pass directories obtained from loadRepositoryDirectoryTree()
- Confirm repository connectivity before existence checks
- Distinguish 'cannot verify' from 'does not exist' in your error handling
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
- GetXMLDataMeta.Exception.ErrorReadingRepository (localized…
- GetXMLDataMeta.Exception.ErrorSavingToRepository (localized…
- StepMeta.Exception.StepCouldNotBeLoaded
- StepMeta.Exception.StepInfoCouldNotBeFound
- StepMeta.Exception.UnableToSaveStepInfo
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)