/** * @return the RaftPeer (address and id) information of the followers. */ List<RaftPeer> getFollowers() { return Collections.unmodifiableList(senders.stream() .map(sender -> sender.getFollower().getPeer()) .collect(Collectors.toList())); }
/** * @return the RaftPeer (address and id) information of the followers. */ List<RaftPeer> getFollowers() { return Collections.unmodifiableList(senders.stream() .map(sender -> sender.getFollower().getPeer()) .collect(Collectors.toList())); }
private Collection<BootStrapProgress> checkAllProgress(long committed) { Preconditions.assertTrue(inStagingState()); return senders.stream() .filter(sender -> !sender.getFollower().isAttendingVote()) .map(sender -> checkProgress(sender.getFollower(), committed)) .collect(Collectors.toCollection(ArrayList::new)); }
private Collection<BootStrapProgress> checkAllProgress(long committed) { Preconditions.assertTrue(inStagingState()); return senders.stream() .filter(sender -> !sender.getFollower().isAttendingVote()) .map(sender -> checkProgress(sender.getFollower(), committed)) .collect(Collectors.toCollection(ArrayList::new)); }
private List<List<FollowerInfo>> divideFollowers(RaftConfiguration conf) { List<List<FollowerInfo>> lists = new ArrayList<>(2); List<FollowerInfo> listForNew = senders.stream() .filter(sender -> conf.containsInConf(sender.getFollower().getPeer().getId())) .map(LogAppender::getFollower) .collect(Collectors.toList()); lists.add(listForNew); if (conf.isTransitional()) { List<FollowerInfo> listForOld = senders.stream() .filter(sender -> conf.containsInOldConf(sender.getFollower().getPeer().getId())) .map(LogAppender::getFollower) .collect(Collectors.toList()); lists.add(listForOld); } return lists; }
RaftPeerId getFollowerId() { return getFollower().getPeer().getId(); }
RaftPeerId getFollowerId() { return getFollower().getPeer().getId(); }
private List<List<FollowerInfo>> divideFollowers(RaftConfiguration conf) { List<List<FollowerInfo>> lists = new ArrayList<>(2); List<FollowerInfo> listForNew = senders.stream() .filter(sender -> conf.containsInConf(sender.getFollower().getPeer().getId())) .map(LogAppender::getFollower) .collect(Collectors.toList()); lists.add(listForNew); if (conf.isTransitional()) { List<FollowerInfo> listForOld = senders.stream() .filter(sender -> conf.containsInOldConf(sender.getFollower().getPeer().getId())) .map(LogAppender::getFollower) .collect(Collectors.toList()); lists.add(listForOld); } return lists; }
long[] getFollowerNextIndices() { return senders.stream().mapToLong(s -> s.getFollower().getNextIndex()).toArray(); }
long[] getFollowerNextIndices() { return senders.stream().mapToLong(s -> s.getFollower().getNextIndex()).toArray(); }
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.")); } }
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.")); } }
private void checkStaging() { if (!inStagingState()) { // it is possible that the bootstrapping is done. Then, fallback to UPDATE_COMMIT UPDATE_COMMIT_EVENT.execute(); } else { final long committedIndex = server.getState().getLog() .getLastCommittedIndex(); Collection<BootStrapProgress> reports = checkAllProgress(committedIndex); if (reports.contains(BootStrapProgress.NOPROGRESS)) { LOG.debug("{} fails the setConfiguration request", server.getId()); stagingState.fail(); } else if (!reports.contains(BootStrapProgress.PROGRESSING)) { // all caught up! applyOldNewConf(); senders.forEach(s -> s.getFollower().startAttendVote()); } } }
private void checkNewPeers() { if (!inStagingState()) { // it is possible that the bootstrapping is done and we still have // remaining STAGINGPROGRESS event to handle. updateLastCommitted(); } else { final long committedIndex = server.getState().getLog() .getLastCommittedIndex(); Collection<BootStrapProgress> reports = checkAllProgress(committedIndex); if (reports.contains(BootStrapProgress.NOPROGRESS)) { LOG.debug("{} fails the setConfiguration request", server.getId()); stagingState.fail(); } else if (!reports.contains(BootStrapProgress.PROGRESSING)) { // all caught up! applyOldNewConf(); senders.forEach(s -> s.getFollower().startAttendVote()); } } }
/** * Update the RpcSender list based on the current configuration */ private void updateSenders(RaftConfiguration conf) { Preconditions.assertTrue(conf.isStable() && !inStagingState()); stopAndRemoveSenders(s -> !conf.containsInConf(s.getFollower().getPeer().getId())); }
/** * Update the RpcSender list based on the current configuration */ private void updateSenders(RaftConfiguration conf) { Preconditions.assertTrue(conf.isStable() && !inStagingState()); stopAndRemoveSenders(s -> !conf.containsInConf(s.getFollower().getPeer().getId())); }
final long leaderNextIndex = leaderLog.getNextIndex(); final long followerMatchIndex = logAppender.getFollower().getMatchIndex(); Assert.assertTrue(followerMatchIndex >= leaderNextIndex - 1); Assert.assertEquals(followerMatchIndex + 1, logAppender.getFollower().getNextIndex()); }, 10, HUNDRED_MILLIS, "assertRaftLog-" + logAppender.getFollower(), LOG)));
RaftServerTestUtil.getLogAppenders(cluster.getLeader()).forEach(logAppender -> { Assert.assertEquals(logAppender.getFollower().getMatchIndex(), index - 1); Assert.assertEquals(logAppender.getFollower().getNextIndex(), index); });