救救孩子,project3b小概率会产生一致性的错误,大概问题在哪?

经过我的密集测试,我确保了 project2,project3a 是正确的,也就是前面代码实现都是正确的,而且出问题只有在3b倒数两个测试用例上。
也就是 TestSplitConfChangeSnapshotUnreliableRecover3B
TestSplitConfChangeSnapshotUnreliableRecoverConcurrentPartition3B 两个。

报错的都是

test_test.go:63: 0 missing element x 0 0 y in Append result
test_test.go:63: 0 missing element x 0 0 y in Append result x 0 4 y
...

这类一致性的问题。

我设置的条件是:

  • unreliable true
  • partition true
  • crash false
  • maxraftlog 100
  • confChange true
  • split true

出现不一致问题的频率大概是 1/13。

如果我设置了只有 split 或者只有 confChange,是不会错误的。
如果我设置了 split,confChange 只有删除 peer,没有增加 peer, 是不会错误的

产生这样的错误一定是,涉及到 confChange,而且一定要有add peer,然后有 split。
我个人猜测会不会是在 snapshot 那里出错,因为这样的情况下一定会存在 apply snapshot 的情况(因为你 add peer 了),但是实在找不到问题在哪,请大家给下思路(当然你也可以提供 debug 方案)。

关于持久化的猜测可以先排除,因为我设置了 crash 为 false。

应用snapshot的时候,未经过初始化的peer不需要删除meta和data,看描述可能是这个问题?

4 个赞

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。