最后一部分介绍一下测试代码中的测试函数。
紧接着上次,现在是TestFailNoAgree函数测试在节点Fail太多的情况下无法达成一致性。
func TestFailNoAgree(t *testing.T) {
servers := 5
cfg := make_config(t, servers, false)
defer cfg.cleanup()
fmt.Printf("Test: no agreement if too many followers fail ...\n")
cfg.one(10, servers)
// 3 of 5 followers disconnect
leader := cfg.checkOneLeader()
cfg.disconnect((leader + 1) % servers)
cfg.disconnect((leader + 2) % servers)
cfg.disconnect((leader + 3) % servers)
index, _, ok := cfg.rafts[leader].Start(20)
if ok != true {
t.Fatalf("leader rejected Start()")
}
if index != 2 {
t.Fatalf("expected index 2, got %v", index)
}
time.Sleep(2 * RaftElectionTimeout)
n, _ := cfg.nCommitted(index)
if n > 0 {
t.Fatalf("%v committed but no majority", n)
}
// repair failures
cfg.connect((leader + 1) % servers)
cfg.connect((leader + 2) % servers)
cfg.connect((leader + 3) % servers)
// the disconnected majority may have chosen a leader from
// among their own ranks, forgetting index 2.
// or perhaps
leader2 := cfg.checkOneLeader()
index2, _, ok2 := cfg.rafts[leader2].Start(30)
if ok2 == false {
t.Fatalf(

本文详细介绍了MIT6.824 Lab2中关于Raft一致性算法的测试,包括TestFailNoAgree测试节点故障无法达成一致、TestConcurrentStarts测试并发请求的一致性以及TestRejoin测试网络分区情况下的处理。通过具体的测试场景,展示了Raft如何处理领导人变更、日志同步和恢复等复杂情况。
最低0.47元/天 解锁文章
2498

被折叠的 条评论
为什么被折叠?



