pentaho/pentaho-kettle · error · KettleException
UserInfo.Error.UserNotLoaded
Error message
UserInfo.Error.UserNotLoaded
What it means
The outer wrapper in loadUserInfo(): any KettleDatabaseException raised while loading the user — including the UserNotFound throws above — is caught and re-thrown as KettleException with message UserInfo.Error.UserNotLoaded plus the login. This is the exception callers actually receive; check its cause to distinguish 'no such user' from a database access failure.
Solutions
- Unwrap e.getCause() (KettleDatabaseException) to see if it is UserNotFound or a real DB failure
- If user-not-found: verify/create the login in R_USER
- If DB failure: check connectivity, grants on R_USER, and schema version
- Use rep.getUserManager()/user listing API to validate the login before calling loadUserInfo
Example fix
// before
UserInfo user = rep.loadUserInfo(login); // UserNotLoaded wraps everything
// after
try {
UserInfo user = rep.loadUserInfo(login);
} catch (KettleException e) {
Throwable cause = e.getCause();
logError("User load failed for " + login + ": " + cause.getMessage(), e);
// branch on cause: missing user vs. database problem
} Defensive patterns
Strategy: try-catch
Validate before calling
// Java: pre-check user existence to avoid the wrapper entirely
// SELECT COUNT(*) FROM R_USER WHERE NAME = ?
boolean exists = ...;
if (!exists) throw new IllegalArgumentException("User not in repository: " + login); Try / catch
try {
UserInfo user = rep.loadUserInfo(login);
} catch (KettleException e) {
Throwable cause = e.getCause(); // KettleDatabaseException
if (String.valueOf(cause == null ? "" : cause.getMessage()).contains("UserNotFound")) {
log.warn("Unknown user: " + login);
} else {
log.error("DB failure loading user " + login + ": " + cause, e);
}
} Prevention
- Always inspect getCause() — UserNotLoaded hides the real reason
- Distinguish user-not-found from database outages in error handling
- Verify repository connectivity and R_USER grants in deployment checks
- Keep password encryption settings consistent when cloning repositories across environments
When it happens
Trigger: Any failure in loadUserInfo(login): unknown login (UserNotFound cause), failed query against R_USER, connection error, or decryption failure while reading the stored password.
Common situations: Repository login/auth flows (including verifyLogin) hitting a nonexistent user, an unreachable repository DB, or password encryption inconsistencies after moving a repository between environments.
Understand the failure class
Background: "User not found", "Invalid user", and "does not exist": what missing-user lookup errors mean across Rocket.Chat, LiteLLM, Phabricator, rustfs, and pnpm — this error's family across 10 libraries.
Related errors
- UserInfo.Error.UserNotFound
- AbsSecurityProvider.ERROR_0002_UNABLE_TO_ACCESS_IS_ALLOWED
- AccessInputMeta.Exception.ErrorReadingRepository
- AddSequenceMeta.Exception.UnableToReadStepInfo
- AddSequenceMeta.Exception.UnableToSaveStepInfo
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/0ca372cfa2094d55.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/repository/kdr/delegates/KettleDatabaseRepositoryUserDelegate.java:72
try {
userInfo.setObjectId( getUserID( login ) );
if ( userInfo.getObjectId() != null ) {
RowMetaAndData r = getUser( userInfo.getObjectId() );
if ( r != null ) {
userInfo.setLogin( r.getString( "LOGIN", null ) );
userInfo.setPassword( Encr.decryptPassword( r.getString( "PASSWORD", null ) ) );
userInfo.setUsername( r.getString( "NAME", null ) );
userInfo.setDescription( r.getString( "DESCRIPTION", null ) );
userInfo.setEnabled( r.getBoolean( "ENABLED", false ) );
return userInfo;
} else {
throw new KettleDatabaseException( BaseMessages.getString( PKG, "UserInfo.Error.UserNotFound", login ) );
}
} else {
throw new KettleDatabaseException( BaseMessages.getString( PKG, "UserInfo.Error.UserNotFound", login ) );
}
} catch ( KettleDatabaseException dbe ) {
throw new KettleException( BaseMessages.getString( PKG, "UserInfo.Error.UserNotLoaded", login, "" ), dbe );
}
}
/**
* Load user with login from repository and verify the password...
*
* @param rep
* @param login
* @param passwd
* @throws KettleException
*/
public IUser loadUserInfo( IUser userInfo, String login, String passwd ) throws KettleException {
if ( userInfo == null || login == null || login.length() <= 0 ) {
throw new KettleDatabaseException( BaseMessages.getString( PKG, "UserInfo.Error.IncorrectPasswortLogin" ) );
}
try {
loadUserInfo( userInfo, login );View on GitHub (pinned to f3058517a1)