书接上文MIT 6.824 Lab3A Key/Value Service。
实验准备
- 实验代码:
git://g.csail.mit.edu/6.824-golabs-2021/src/kvraft
- 如何测试:
go test -run 3B -race
- 实验指导:6.824 Lab 3: Fault-tolerant Key/Value Service (mit.edu)
实验目标
修改KVServer,在Raft状态过大时生成快照,KVServer重新启动后,加载快照。
一些提示
- 考虑记录哪些信息在快照中,需要包含检测重复请求的相关信息。
- Lab3测试耗时应在400秒,TestSnapshotSize3B测试应少于20秒。
发送和接收快照
事实上只需要改动接收applyCh
的函数就好,在里面添加发送和接收快照的代码。
index
表示KVServer应用的最后的日志,即msg.CommandIndex
或msg.SnapshotIndex
。
index := 0
if msg.SnapshotValid && len(msg.Snapshot) > 0 {
if kv.rf.CondInstallSnapshot(msg.SnapshotTerm, msg.SnapshotIndex, msg.Snapshot) {
r := bytes.NewBuffer(msg.Snapshot)
d := labgob.NewDecoder(r)
d.Decode(&kv.data)
d.Decode(&kv.mseq)
index = msg.SnapshotIndex
}
}
if index != 0 && kv.rf.StateSize() > kv.maxraftstate && kv.maxraftstate != -1 {
w := new(bytes.Buffer)
e := labgob.NewEncoder(w)
e.Encode(kv.data)
e.Encode(kv.mseq)
kv.rf.Snapshot(index, w.Bytes())
}
除了KVServer的改动,还需要在Make Raft中将persister.ReadSnapshot()
发送给KVServer,用于重启后恢复数据。
实验总结
Lab3B比较简单,当然前提是之前的实验做的是没问题的,如果一直没有通过3B的所有测试,就再多跑几遍Lab2和Lab3A看看是不是还有什么问题。
最后,为了证明我不是在乱写,附上我的测试结果。