RoleInfoProto buildRoleInfoProto()

in ratis-server/src/main/java/org/apache/ratis/server/impl/RoleInfo.java [152:199]


  RoleInfoProto buildRoleInfoProto(RaftServerImpl server) {
    final RaftPeerRole currentRole = getCurrentRole();
    final RoleInfoProto.Builder proto = RoleInfoProto.newBuilder()
        .setSelf(server.getPeer().getRaftPeerProto())
        .setRole(currentRole)
        .setRoleElapsedTimeMs(getRoleElapsedTimeMs());

    switch (currentRole) {
      case LEADER:
        getLeaderState().ifPresent(leader -> {
          final LeaderInfoProto.Builder b = LeaderInfoProto.newBuilder()
              .setTerm(leader.getCurrentTerm());
          leader.getLogAppenders()
              .map(LogAppender::getFollower)
              .map(f -> toServerRpcProto(f.getPeer(), f.getLastRpcResponseTime().elapsedTimeMs()))
              .forEach(b::addFollowerInfo);
          proto.setLeaderInfo(b);
        });
        return proto.build();

      case CANDIDATE:
        return proto.setCandidateInfo(CandidateInfoProto.newBuilder()
            .setLastLeaderElapsedTimeMs(server.getState().getLastLeaderElapsedTimeMs()))
            .build();

      case LISTENER:
      case FOLLOWER:
        // FollowerState can be null while adding a new peer as it is not a voting member yet
        final FollowerState follower = getFollowerState().orElse(null);
        final long rpcElapsed;
        final int outstandingOp;
        if (follower != null) {
          rpcElapsed = follower.getLastRpcTime().elapsedTimeMs();
          outstandingOp = follower.getOutstandingOp();
        } else {
          rpcElapsed = 0;
          outstandingOp = 0;
        }
        final RaftPeer leader = server.getRaftConf().getPeer(server.getState().getLeaderId());
        return proto.setFollowerInfo(FollowerInfoProto.newBuilder()
            .setLeaderInfo(toServerRpcProto(leader, rpcElapsed))
            .setOutstandingOp(outstandingOp))
            .build();

      default:
        throw new IllegalStateException("Unexpected role " + currentRole);
    }
  }