/** Returns the list of tasks by node */
  public Map<DiscoveryNode, List<TaskInfo>> getPerNodeTasks() {
    if (nodes != null) {
      return nodes;
    }
    Map<DiscoveryNode, List<TaskInfo>> nodeTasks = new HashMap<>();

    Set<DiscoveryNode> nodes = new HashSet<>();
    for (TaskInfo shard : tasks) {
      nodes.add(shard.getNode());
    }

    for (DiscoveryNode node : nodes) {
      List<TaskInfo> tasks = new ArrayList<>();
      for (TaskInfo taskInfo : this.tasks) {
        if (taskInfo.getNode().equals(node)) {
          tasks.add(taskInfo);
        }
      }
      nodeTasks.put(node, tasks);
    }
    this.nodes = nodeTasks;
    return nodeTasks;
  }