Mit6.824-lab3b-2022
写在前面
个人感觉3b需要做的工作比3a还要简单,只是添加了个server的snapshot,但是由于加入了snapshot所以3a的测试对raft的代码要求又高了一个档次,我基本上所有的精力也都花到对raft部分的debug上了,由于进行apply的chan不能上锁,这里会出现各种乱序的bug,只能说这个地方的设计确实是有点难受了。而且每次十几万行的log信息,找出来错误信息再一点点分析真的头痛,以及client还会反复发送命令,覆写之前的命令等,让log更加困难。不过也怪自己raft写的实在是差强人意,感觉一开始设计的逻辑就不太好,最后只能到处缝缝补补。做到后面真的想干脆重构代码算了。
实验目标
实验要求很简单,给server增加一个snapshot功能,每当raft的log长度到达一个值,就打包一个snapshot并发送snapshot命令给raft,同时当raft发送snapshot时,接收并把自己本地维持的数据替换为snapshot的数据。
这里还是借用一下这位的图,代码在这里

实验内容
读写snapshot
这部分和raft一样,没什么好说的,只需要保持本地数据和每个client发送的最新命令的index即可。
func (kv *KVServer)kvServerSnapShot()[]byte{
w := new(bytes.Buffer)
e :=labgob.NewEncoder(w)
if e.Encode(kv.DB) != nil||
e.Encode(kv.ClientSequence) != nil{
return nil
}
return w.Bytes()
}
func (kv *KVServer)readSnapShot(data []byte


7512

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



