private boolean shouldWithholdVotes(long candidateTerm) { if (state.getCurrentTerm() < candidateTerm) { return false; } else if (isLeader()) { return true; } else { // following a leader and not yet timeout return isFollower() && state.hasLeader() && role.getFollowerState().map(FollowerState::shouldWithholdVotes).orElse(false); } }
@Override public void run() { while (monitorRunning && server.isFollower()) { final long electionTimeout = server.getRandomTimeoutMs(); try { Thread.sleep(electionTimeout); if (!monitorRunning || !server.isFollower()) { LOG.info("{} heartbeat monitor quit", server.getId()); break; } synchronized (server) { if (!inLogSync && lastRpcTime.elapsedTimeMs() >= electionTimeout) { LOG.info("{} changes to CANDIDATE, lastRpcTime:{}, electionTimeout:{}ms", server.getId(), lastRpcTime.elapsedTimeMs(), electionTimeout); // election timeout, should become a candidate server.changeToCandidate(); break; } } } catch (InterruptedException e) { LOG.info(this + " was interrupted: " + e); LOG.trace("TRACE", e); return; } catch (Exception e) { LOG.warn(this + " caught an exception", e); } } }
@Override public void run() { while (monitorRunning && server.isFollower()) { final long electionTimeout = server.getRandomTimeoutMs(); try { Thread.sleep(electionTimeout); if (!monitorRunning || !server.isFollower()) { LOG.info("{} heartbeat monitor quit", server.getId()); break; } synchronized (server) { if (outstandingOp.get() == 0 && lastRpcTime.elapsedTimeMs() >= electionTimeout) { LOG.info("{} changes to CANDIDATE, lastRpcTime:{}, electionTimeout:{}ms", server.getId(), lastRpcTime.elapsedTimeMs(), electionTimeout); // election timeout, should become a candidate server.changeToCandidate(); break; } } } catch (InterruptedException e) { LOG.info(this + " was interrupted: " + e); LOG.trace("TRACE", e); return; } catch (Exception e) { LOG.warn(this + " caught an exception", e); } } }
private boolean shouldWithholdVotes(long candidateTerm) { if (state.getCurrentTerm() < candidateTerm) { return false; } else if (isLeader()) { return true; } else { return isFollower() && state.hasLeader() && heartbeatMonitor.shouldWithholdVotes(); } }
synchronized void changeToCandidate() { Preconditions.assertTrue(isFollower()); shutdownHeartbeatMonitor(); setRole(Role.CANDIDATE, "changeToCandidate"); // start election electionDaemon = new LeaderElection(this); electionDaemon.start(); }
synchronized void changeToCandidate() { Preconditions.assertTrue(isFollower()); role.shutdownFollowerState(); setRole(RaftPeerRole.CANDIDATE, "changeToCandidate"); if (state.checkForExtendedNoLeader()) { stateMachine.notifyExtendedNoLeader(getGroup(), getRoleInfoProto()); } // start election role.startLeaderElection(this); }
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);
if (lifeCycle.getCurrentState() == RUNNING && isFollower() && getState().getCurrentTerm() == currentTerm) {