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

  1. Unwrap e.getCause() (KettleDatabaseException) to see if it is UserNotFound or a real DB failure
  2. If user-not-found: verify/create the login in R_USER
  3. If DB failure: check connectivity, grants on R_USER, and schema version
  4. 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

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


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)