Skip to content

GenericHelixControler.getLeaderController does not check for potential conrtroller's _helixMapper's nullity #2963

@jacob-netguardians

Description

@jacob-netguardians

Describe the bug

Plain old NPE.
Depending on the order of the controllers in the set of existing controllers, and especially depending on the position of the "leader" controller in the collection, some controllers prior to the "leader" one may still have their _helixMapper field set to null, resulting with an NPE while filtering for leader.

To Reproduce

Happens from time to time, depending on the ordering of the retrieved controllers in the collection.

Expected behavior

controllers without _helixMapper set cannot be leaders, so we could expect them to be filtered out during the search.

Here is the code I propose to change (in GenericHelixController.java):

  public static GenericHelixController getLeaderController(String clusterName) {
    if (clusterName != null) {
      ImmutableSet<GenericHelixController> controllers = _helixControllerFactory.get(clusterName);
      if (controllers != null) {
        return controllers.stream().filter(controller -> controller._helixManager.isLeader())
            .findAny().orElse(null);
      }
    }
    return null;
  }

to

  public static GenericHelixController getLeaderController(String clusterName) {
    if (clusterName != null) {
      ImmutableSet<GenericHelixController> controllers = _helixControllerFactory.get(clusterName);
      if (controllers != null) {
        return controllers.stream().filter(controller -> controller._helixManager != null && controller._helixManager.isLeader())
            .findAny().orElse(null);
      }
    }
    return null;
  }

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions