Builder setConf(RaftConfiguration transitionalConf) { Objects.requireNonNull(transitionalConf); Preconditions.assertTrue(transitionalConf.isTransitional()); Preconditions.assertTrue(!forceTransitional); forceStable = true; return setConf(transitionalConf.conf); }
Builder setConf(RaftConfiguration transitionalConf) { Objects.requireNonNull(transitionalConf); Preconditions.assertTrue(transitionalConf.isTransitional()); Preconditions.assertTrue(!forceTransitional); forceStable = true; return setConf(transitionalConf.conf); }
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; }
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; }
private Optional<MinMajorityMax> getMajorityMin(ToLongFunction<FollowerInfo> followerIndex, LongSupplier logIndex) { final RaftPeerId selfId = server.getId(); final RaftConfiguration conf = server.getRaftConf(); final List<FollowerInfo> followers = voterLists.get(0); final boolean includeSelf = conf.containsInConf(selfId); if (followers.isEmpty() && !includeSelf) { return Optional.empty(); } final long[] indicesInNewConf = getSorted(followers, includeSelf, followerIndex, logIndex); final MinMajorityMax newConf = MinMajorityMax.valueOf(indicesInNewConf); if (!conf.isTransitional()) { return Optional.of(newConf); } else { // configuration is in transitional state final List<FollowerInfo> oldFollowers = voterLists.get(1); final boolean includeSelfInOldConf = conf.containsInOldConf(selfId); if (oldFollowers.isEmpty() && !includeSelfInOldConf) { return Optional.empty(); } final long[] indicesInOldConf = getSorted(oldFollowers, includeSelfInOldConf, followerIndex, logIndex); final MinMajorityMax oldConf = MinMajorityMax.valueOf(indicesInOldConf); return Optional.of(newConf.combine(oldConf)); } }
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 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 void checkAndUpdateConfiguration(TermIndex[] entriesToCheck) { final RaftConfiguration conf = server.getRaftConf(); if (committedConf(entriesToCheck)) { if (conf.isTransitional()) { replicateNewConf(); } else { // the (new) log entry has been committed LOG.debug("{} sends success to setConfiguration request", server.getId()); pendingRequests.replySetConfiguration(); // if the leader is not included in the current configuration, step down if (!conf.containsInConf(server.getId())) { LOG.info("{} is not included in the new configuration {}. Step down.", server.getId(), conf); try { // leave some time for all RPC senders to send out new conf entry Thread.sleep(server.getMinTimeoutMs()); } catch (InterruptedException ignored) { } // the pending request handler will send NotLeaderException for // pending client requests when it stops server.shutdown(); } } } }
private void checkAndUpdateConfiguration(TermIndex[] entriesToCheck) { final RaftConfiguration conf = server.getRaftConf(); if (committedConf(entriesToCheck)) { if (conf.isTransitional()) { replicateNewConf(); } else { // the (new) log entry has been committed pendingRequests.replySetConfiguration(server::getCommitInfos); // if the leader is not included in the current configuration, step down if (!conf.containsInConf(server.getId())) { LOG.info("{} is not included in the new configuration {}. Step down.", server.getId(), conf); try { // leave some time for all RPC senders to send out new conf entry Thread.sleep(server.getMinTimeoutMs()); } catch (InterruptedException ignored) { } // the pending request handler will send NotLeaderException for // pending client requests when it stops server.shutdown(false); } } } }
final long min; if (!conf.isTransitional()) { majority = majorityInNewConf; min = indicesInNewConf[0];
Assert.assertFalse(cluster.getLeader().getRaftConf().isTransitional());
Assert.assertFalse(cluster.getLeader().getRaftConf().isTransitional());
Assert.assertFalse(cluster.getLeader().getRaftConf().isTransitional());
Assert.assertFalse(cluster.getLeader().getRaftConf().isTransitional());