(BRequestVoteArgument candidate)
| 630 | } |
| 631 | |
| 632 | private boolean isLastLogUpToDate(BRequestVoteArgument candidate) throws RocksDBException { |
| 633 | // NodeReady local candidate |
| 634 | // false false IsLastLogUpToDate |
| 635 | // false true false |
| 636 | // true false false |
| 637 | // true true IsLastLogUpToDate |
| 638 | var last = logSequence.lastRaftLogTermIndex(); |
| 639 | if (!logSequence.getNodeReady()) { |
| 640 | if (!candidate.getNodeReady()) { |
| 641 | // 整个Raft集群第一次启动时,允许给初始节点投票。此时所有的初始节点形成多数派。任何一个当选都是可以的。 |
| 642 | // 以后由于机器更换再次启动而处于初始状态的节点肯定是少数派,即使它们之间互相投票,也不能成功。 |
| 643 | // 如果违背了这点,意味着违背了Raft的可用原则,已经不在Raft的处理范围内了。 |
| 644 | return isLastLogUpToDate(last, candidate); |
| 645 | } |
| 646 | |
| 647 | // 拒绝投票直到发现达成多数派。 |
| 648 | return false; |
| 649 | } |
| 650 | return candidate.getNodeReady() && isLastLogUpToDate(last, candidate); |
| 651 | } |
| 652 | |
| 653 | private static boolean isLastLogUpToDate(RaftLog last, BRequestVoteArgument candidate) { |
| 654 | if (candidate.getLastLogTerm() > last.getTerm()) |
no test coverage detected