()
| 739 | } |
| 740 | |
| 741 | private void sendRequestVote() throws RocksDBException { |
| 742 | requestVotes.clear(); // 每次选举开始清除。 |
| 743 | // LogSequence.SetVoteFor(Name); // 先收集结果,达到 RaftConfig.HalfCount 才判断是否给自己投票。 |
| 744 | logSequence.trySetTerm(logSequence.getTerm() + 1); |
| 745 | |
| 746 | var arg = new BRequestVoteArgument(); |
| 747 | arg.setTerm(logSequence.getTerm()); |
| 748 | arg.setCandidateId(getName()); |
| 749 | var log = logSequence.lastRaftLogTermIndex(); |
| 750 | arg.setLastLogIndex(log.getIndex()); |
| 751 | arg.setLastLogTerm(log.getTerm()); |
| 752 | arg.setNodeReady(logSequence.getNodeReady()); |
| 753 | |
| 754 | nextVoteTime = System.currentTimeMillis() + raftConfig.getElectionTimeout(); |
| 755 | server.getConfig().forEachConnector(c -> { |
| 756 | var rpc = new RequestVote(); |
| 757 | rpc.Argument = arg; |
| 758 | requestVotes.add(rpc); |
| 759 | var sendResult = rpc.Send(c.TryGetReadySocket(), |
| 760 | p -> processRequestVoteResult(rpc, c), raftConfig.getAppendEntriesTimeout() - 100); |
| 761 | logger.info("{}:{}: SendRequestVote {}", getName(), sendResult, rpc); |
| 762 | }); |
| 763 | } |
| 764 | |
| 765 | private void convertStateFromFollowerTo(RaftState newState) throws RocksDBException { |
| 766 | switch (newState) { |
no test coverage detected