cita-cloud / consensus_raft

The raft consensus component for CITA Cloud.
Apache License 2.0
3 stars 0 forks source link

fix: get term error & fix: cover conflict entry #77

Closed Jayanring closed 1 year ago

Jayanring commented 1 year ago

fix #76

Jayanring commented 1 year ago

修复两个问题:

  1. 获取term不正确导致异常行为。之前有新的entry添加时就会把所有applied的删除,如果查询一个刚刚删除的index的term会用hard_state中的term替代。有新的MsgAppend时会检查消息中的index,term是否和自己匹配,但这个index可能已经被删除,若这条消息之前刚经历leader变换,hard_state中的term会最先被更新,返回一个错误的term,导致节点认为这条消息与自身状态不匹配。解决方法:首先查不到时也不能使用hard_state中的term。raft可以处理已压缩的错误,但不能处理一个错误的数据。然后storage保存最近几个已应用的entry,目前是5个。
  2. 添加entry时没有覆盖冲突的entry,导致有重复的index。raft的机制是,如果有一个未提交的entry与接收到的entry,index相同但term不同,则这个未提交的entry将被覆盖,但之前会保留未提交的entry并添加接收到的entry,这样无法保证数据一致性,程序也无法正常运行。可以自己构造覆盖的例子。解决方法:用新的entry覆盖所有冲突的entry。

还有一个小问题,commit data为空的NormalEntry不会有任何操作,因此applied_index的增长会跳过这个entry的index,以防applied_index的判断出现问题,现在不过滤data为空的entry。