经过我的密集测试,我确保了 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。