1 raft要达成一致,是需要半数以上的节点同意的,但是这个逻辑在jraft中非常的隐蔽。
这个逻辑是在Ballot类,在init方法中我们看到
this.quorum = this.peers.size() / 2 + 1;
这个就是核心点了。
Ballot类的grant的核心逻辑就是,如果命中了初始化的节点之一,就
this.quorum--;
Ballot类的最后判断也就很简单了,就是判断quorum是不是小于0
public boolean isGranted() {
return this.quorum <= 0 && oldQuorum <= 0;
}
2 Ballot的isGranted方法在使用上也有点容易困惑
这个代码咋一看,以为waiter.onCommitted肯定是会被执行到的,但其实中途有个return。
条件是lastCommittedIndex == 0,只有没超过半数lastCommittedIndex == 0才成立,只要超过半数lastCommittedIndex = logIndex。
所以这样才是把逻辑串起来,只是初次看不容易理解