Builder setOldConf(RaftConfiguration stableConf) { Objects.requireNonNull(stableConf); Preconditions.assertTrue(stableConf.isStable()); Preconditions.assertTrue(!forceStable); forceTransitional = true; return setOldConf(stableConf.conf); }
Builder setOldConf(RaftConfiguration stableConf) { Objects.requireNonNull(stableConf); Preconditions.assertTrue(stableConf.isStable()); Preconditions.assertTrue(!forceStable); forceTransitional = true; return setOldConf(stableConf.conf); }
boolean hasNoChange(RaftPeer[] newMembers) { if (!isStable() || conf.size() != newMembers.length) { return false; } for (RaftPeer peer : newMembers) { if (!conf.contains(peer.getId())) { return false; } } return true; }
boolean hasNoChange(RaftPeer[] newMembers) { if (!isStable() || conf.size() != newMembers.length) { return false; } for (RaftPeer peer : newMembers) { if (!conf.contains(peer.getId())) { return false; } } return true; }
/** * 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())); }
/** * check if the remote peer is not included in the current conf * and should shutdown. should shutdown if all the following stands: * 1. this is a leader * 2. current conf is stable and has been committed * 3. candidate id is not included in conf * 4. candidate's last entry's index < conf's index */ private boolean shouldSendShutdown(RaftPeerId candidateId, TermIndex candidateLastEntry) { return isLeader() && getRaftConf().isStable() && getState().isConfCommitted() && !getRaftConf().containsInConf(candidateId) && candidateLastEntry.getIndex() < getRaftConf().getLogEntryIndex() && role.getLeaderState().map(ls -> !ls.isBootStrappingPeer(candidateId)).orElse(false); }
/** * check if the remote peer is not included in the current conf * and should shutdown. should shutdown if all the following stands: * 1. this is a leader * 2. current conf is stable and has been committed * 3. candidate id is not included in conf * 4. candidate's last entry's index < conf's index */ private boolean shouldSendShutdown(RaftPeerId candidateId, TermIndex candidateLastEntry) { return isLeader() && getRaftConf().isStable() && getState().isConfCommitted() && !getRaftConf().containsInConf(candidateId) && candidateLastEntry.getIndex() < getRaftConf().getLogEntryIndex() && !leaderState.isBootStrappingPeer(candidateId); }
if (!current.isStable() || leaderState.inStagingState() || !state.isConfCommitted()) { throw new ReconfigurationInProgressException( "Reconfiguration is already in progress: " + current);
final LeaderState leaderState = role.getLeaderStateNonNull(); if (!current.isStable() || leaderState.inStagingState() || !state.isConfCommitted()) { throw new ReconfigurationInProgressException( "Reconfiguration is already in progress: " + current);
private static void waitAndCheckNewConf(MiniRaftCluster cluster, RaftPeer[] peers, Collection<RaftPeerId> deadPeers) { LOG.info("waitAndCheckNewConf: peers={}, deadPeers={}, {}", Arrays.asList(peers), deadPeers, cluster.printServers()); Assert.assertNotNull(cluster.getLeader()); int numIncluded = 0; int deadIncluded = 0; final RaftConfiguration current = RaftConfiguration.newBuilder() .setConf(peers).setLogEntryIndex(0).build(); for (RaftServerImpl server : cluster.iterateServerImpls()) { LOG.info("checking {}", server); if (deadPeers != null && deadPeers.contains(server.getId())) { if (current.containsInConf(server.getId())) { deadIncluded++; } continue; } if (current.containsInConf(server.getId())) { numIncluded++; Assert.assertTrue(server.getRaftConf().isStable()); Assert.assertTrue(server.getRaftConf().hasNoChange(peers)); } else if (server.isAlive()) { // The server is successfully removed from the conf // It may not be shutdown since it may not be able to talk to the new leader (who is not in its conf). Assert.assertTrue(server.getRaftConf().isStable()); Assert.assertFalse(server.getRaftConf().containsInConf(server.getId())); } } Assert.assertEquals(peers.length, numIncluded + deadIncluded); }
private static void waitAndCheckNewConf(MiniRaftCluster cluster, RaftPeer[] peers, Collection<String> deadPeers) throws Exception { LOG.info(cluster.printServers()); Assert.assertNotNull(cluster.getLeader()); int numIncluded = 0; int deadIncluded = 0; final RaftConfiguration current = RaftConfiguration.newBuilder() .setConf(peers).setLogEntryIndex(0).build(); for (RaftServerImpl server : cluster.iterateServerImpls()) { if (deadPeers != null && deadPeers.contains(server.getId().toString())) { if (current.containsInConf(server.getId())) { deadIncluded++; } continue; } if (current.containsInConf(server.getId())) { numIncluded++; Assert.assertTrue(server.getRaftConf().isStable()); Assert.assertTrue(server.getRaftConf().hasNoChange(peers)); } else { Assert.assertFalse(server.getId() + " is still running: " + server, server.isAlive()); } } Assert.assertEquals(peers.length, numIncluded + deadIncluded); }