LogAppender newLogAppender( LeaderState state, RaftPeer peer, Timestamp lastRpcTime, long nextIndex, boolean attendVote) { final FollowerInfo f = new FollowerInfo(peer, lastRpcTime, nextIndex, attendVote); return getProxy().getFactory().newLogAppender(this, state, f); }
protected void checkResponseTerm(long responseTerm) { synchronized (server) { if (isAppenderRunning() && follower.isAttendingVote() && responseTerm > leaderState.getCurrentTerm()) { leaderState.submitUpdateStateEvent( new LeaderState.StateUpdateEvent(StateUpdateEventType.STEPDOWN, responseTerm)); } } } }
private void prepare() { synchronized (server) { if (running) { final RaftConfiguration conf = server.getRaftConf(); if (conf.isTransitional() && server.getState().isConfCommitted()) { // the configuration is in transitional state, and has been committed // so it is time to generate and replicate (new) conf. replicateNewConf(); } } } }
private boolean shouldWithholdVotes(long candidateTerm) { if (state.getCurrentTerm() < candidateTerm) { return false; } else if (isLeader()) { return true; } else { return isFollower() && state.hasLeader() && heartbeatMonitor.shouldWithholdVotes(); } }
RaftConfiguration generateOldNewConf(RaftConfiguration current, long logIndex) { return RaftConfiguration.newBuilder() .setConf(newConf) .setOldConf(current) .setLogEntryIndex(logIndex) .build(); }
LeaderElection(RaftServerImpl server) { this.server = server; conf = server.getRaftConf(); others = conf.getOtherPeers(server.getId()); this.running = true; }
PendingRequests(RaftServerImpl server) { this.server = server; this.pendingRequests = new RequestMap(server.getId()); this.delayedReplies = new DelayedReplies(server.getId()); }
private void updateConfiguration(long logIndex, RaftConfiguration newConf) { voterLists = divideFollowers(newConf); server.getState().setRaftConf(logIndex, newConf); }
synchronized RequestVoteRequestProto createRequestVoteRequest( RaftPeerId targetId, long term, TermIndex lastEntry) { return ServerProtoUtils.toRequestVoteRequestProto(getId(), targetId, groupId, term, lastEntry); }
@Override public RaftClientReply setConfiguration(SetConfigurationRequest request) throws IOException { return getImpl().setConfiguration(request); }
@Override public RequestVoteReplyProto requestVote(RequestVoteRequestProto r) throws IOException { return getImpl().requestVote(r); }
@Override public CompletableFuture<RaftClientReply> submitClientRequestAsync( RaftClientRequest request) throws IOException { return getImpl().submitClientRequestAsync(request); }
void fail() { stopAndRemoveSenders(s -> !s.getFollower().isAttendingVote()); LeaderState.this.stagingState = null; // send back failure response to client's request pendingRequests.failSetConfiguration( new ReconfigurationTimeoutException("Fail to set configuration " + newConf + ". Timeout when bootstrapping new peers.")); } }
public synchronized long[] getFollowerNextIndices() { LeaderState s = this.leaderState; if (s == null || !isLeader()) { return null; } return s.getFollowerNextIndices(); }
protected void checkResponseTerm(long responseTerm) { synchronized (server) { if (isAppenderRunning() && follower.isAttendingVote() && responseTerm > leaderState.getCurrentTerm()) { leaderState.submitStepDownEvent(responseTerm); } } } }
TransactionContext getTransactionContext(long index) { PendingRequest pendingRequest = pendingRequests.get(index); // it is possible that the pendingRequest is null if this peer just becomes // the new leader and commits transactions received by the previous leader return pendingRequest != null ? pendingRequest.getEntry() : null; }
LogAppender newLogAppender( LeaderState state, RaftPeer peer, Timestamp lastRpcTime, long nextIndex, boolean attendVote) { final FollowerInfo f = new FollowerInfo(getId(), peer, lastRpcTime, nextIndex, attendVote, rpcSlownessTimeoutMs); return getProxy().getFactory().newLogAppender(this, state, f); }
private void prepare() { synchronized (server) { if (running) { final RaftConfiguration conf = server.getRaftConf(); if (conf.isTransitional() && server.getState().isConfCommitted()) { // the configuration is in transitional state, and has been committed // so it is time to generate and replicate (new) conf. replicateNewConf(); } } } }
TransactionContext getTransactionContext(long index) { PendingRequest pendingRequest = pendingRequests.get(index); // it is possible that the pendingRequest is null if this peer just becomes // the new leader and commits transactions received by the previous leader return pendingRequest != null ? pendingRequest.getEntry() : null; }