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);
}
}