关于 recovery from Snapshot的问题

在 2C 以及后面包含crash的测试中,存在将peer shutdown 再restart的情况。

发现有的peer在restart的时候,从peerStorage 取出的 truncated Index 不是自己的,而是其他peer的Index。

譬如说有 1 2 3 三个节点,1是leader, 3落后了, 1要发送snapshot给3
1 的 truncatedIndex 是 10, 但是在发送snapshot给3的时候 appliedIndex已经是11,就会生成一份truncatedIndex是11的snapshot并发送给3。

3 成功applySnapshot,并更新了自己的truncatedIndex(通过打日志发现,peerStorage里面的truncatedIndex确实是11)

过一段时间,123都崩溃然后恢复,这时候,有概率会出现,3在执行newRaft的时候,从peerStorage里面得到的truncatedIndex 不是 11 而是10,于是会要求想要拿到 [10+1,lastIndex) 的日志,但是实际上3只有 [11+1,lastIndex) 的日志,这时就会报错。

请教一下这种情况该如何排查,是少更新了什么信息吗?

savesnapshot 的时候, 你是不是少更新了 truncateIndex 到 applyState 中? 这需要持久化

我后面debug出来了,是因为更新truncatedIndex的时候,没有判断compact和snapshot哪个更新,导致truncatedIndex回退了