pentaho/pentaho-kettle · error · KettleDatabaseException

UserInfo.Error.UserNotFound

Error message

UserInfo.Error.UserNotFound

What it means

Thrown inside loadUserInfo() when no repository user row matches the supplied login: either the query returned no rows or the user row exists but is invalid, raising KettleDatabaseException with UserInfo.Error.UserNotFound. That exception is then caught and re-wrapped as UserInfo.Error.UserNotLoaded in a KettleException, so the user-facing message is UserNotLoaded with UserNotFound as the cause.

Solutions

  1. Verify the login exists: query R_USER for the NAME value
  2. Check you are connected to the intended repository database/schema
  3. Create the user via UserRepository/rep.getUserInfo or the repository user-management UI
  4. Confirm the exact case and spelling of the login string

Example fix

// before
UserInfo user = rep.loadUserInfo("adimn"); // typo

// after
UserInfo user = rep.loadUserInfo("admin"); // verify login in R_USER first
if (user == null || !user.isEnabled()) {
  throw new KettleException("User 'admin' missing or disabled in repository");
}
Defensive patterns

Strategy: validation

Validate before calling

// Java: check the login exists before loadUserInfo
// SELECT COUNT(*) FROM R_USER WHERE LOWER(NAME) = LOWER(?)
boolean userExists = rep.getUserManager() != null
    && Arrays.stream(rep.getUserManager().getUsers())
        .anyMatch(u -> u.getLogin().equalsIgnoreCase(login));
if (!userExists) throw new IllegalArgumentException("Unknown repository user: " + login);

Try / catch

try {
  UserInfo user = rep.loadUserInfo(login);
} catch (KettleException e) {
  log.error("Repository user not found: " + login, e);
  throw new IllegalArgumentException("Unknown user: " + login, e);
}

Prevention

When it happens

Trigger: Calling loadUserInfo(login) (or verifyLogin which calls it) with a login that has no row in R_USER, or where the row query returns no usable record.

Common situations: Typo in the username, authenticating against the wrong repository database, user deleted by an admin, or case-sensitivity mismatch in the login value.

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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/repository/kdr/delegates/KettleDatabaseRepositoryUserDelegate.java:66

      quoteTable( KettleDatabaseRepository.TABLE_R_USER ), quote( KettleDatabaseRepository.FIELD_USER_ID_USER ),
      quote( KettleDatabaseRepository.FIELD_USER_LOGIN ), login );
  }

  // Load user with login from repository, don't verify password...
  public IUser loadUserInfo( IUser userInfo, String login ) throws KettleException {
    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 {

View on GitHub (pinned to f3058517a1)