void startFollowerState(RaftServerImpl server) { updateAndGet(followerState, new FollowerState(server)).start(); }
private void shutdownHeartbeatMonitor() { final FollowerState hm = heartbeatMonitor; if (hm != null) { hm.stopRunning(); hm.interrupt(); } heartbeatMonitor = null; }
private Optional<FollowerState> updateLastRpcTime(FollowerState.UpdateType updateType) { final Optional<FollowerState> fs = role.getFollowerState(); if (fs.isPresent() && lifeCycle.getCurrentState() == RUNNING) { fs.get().updateLastRpcTime(updateType); return fs; } else { return Optional.empty(); } }
LOG.info("{}-{}: Withhold vote from candidate {} with term {}. State: leader={}, term={}, lastRpcElapsed={}", getId(), role, candidateId, candidateTerm, state.getLeaderId(), state.getCurrentTerm(), fs != null? fs.getLastRpcTime().elapsedTimeMs() + "ms": null); } else if (state.recognizeCandidate(candidateId, candidateTerm)) { final boolean termUpdated = changeToFollower(candidateTerm, true, "recognizeCandidate:" + candidateId); fs.updateLastRpcTime(FollowerState.UpdateType.REQUEST_VOTE); state.grantVote(candidateId); voteGranted = true;
role.getFollowerState().ifPresent(fs -> { final ServerRpcProto leaderInfo = ServerProtoUtils.toServerRpcProto( getRaftConf().getPeer(state.getLeaderId()), fs.getLastRpcTime().elapsedTimeMs()); roleInfo.setFollowerInfo(FollowerInfoProto.newBuilder() .setLeaderInfo(leaderInfo) .setOutstandingOp(fs.getOutstandingOp())); }); break;
private boolean shouldWithholdVotes(long candidateTerm) { if (state.getCurrentTerm() < candidateTerm) { return false; } else if (isLeader()) { return true; } else { return isFollower() && state.hasLeader() && heartbeatMonitor.shouldWithholdVotes(); } }
LOG.info("{}-{}: Withhold vote from candidate {} with term {}. State: leader={}, term={}, lastRpcElapsed={}", getId(), role, candidateId, candidateTerm, state.getLeaderId(), state.getCurrentTerm(), isFollower()? heartbeatMonitor.getLastRpcTime().elapsedTimeMs() + "ms": null); } else if (state.recognizeCandidate(candidateId, candidateTerm)) { boolean termUpdated = changeToFollower(candidateTerm, false); heartbeatMonitor.updateLastRpcTime(false); state.grantVote(candidateId); voteGranted = true;
void shutdownFollowerState() { final FollowerState follower = followerState.getAndSet(null); if (follower != null) { LOG.info("{}: shutdown {}", id, follower.getClass().getSimpleName()); follower.stopRunning(); follower.interrupt(); } }
private void startHeartbeatMonitor() { Preconditions.assertTrue(heartbeatMonitor == null, "heartbeatMonitor != null"); LOG.debug("{} starts heartbeatMonitor", getId()); heartbeatMonitor = new FollowerState(this); heartbeatMonitor.start(); }
getId(), previous, ServerProtoUtils.toString(reply)); followerState.ifPresent(fs -> fs.updateLastRpcTime(FollowerState.UpdateType.APPEND_COMPLETE)); return CompletableFuture.completedFuture(reply); (r, t) -> followerState.ifPresent(fs -> fs.updateLastRpcTime(FollowerState.UpdateType.APPEND_COMPLETE)) ).thenApply(v -> { final AppendEntriesReplyProto reply;
heartbeatMonitor.updateLastRpcTime(true); heartbeatMonitor.updateLastRpcTime(false);
heartbeatMonitor.updateLastRpcTime(true); heartbeatMonitor.updateLastRpcTime(false);