MIT 6.824 Lab3B Key/Value Service with Snapshots

832 阅读1分钟

书接上文MIT 6.824 Lab3A Key/Value Service

实验准备

  1. 实验代码:git://g.csail.mit.edu/6.824-golabs-2021/src/kvraft
  2. 如何测试:go test -run 3B -race
  3. 实验指导:6.824 Lab 3: Fault-tolerant Key/Value Service (mit.edu)

实验目标

修改KVServer,在Raft状态过大时生成快照,KVServer重新启动后,加载快照。

一些提示

  1. 考虑记录哪些信息在快照中,需要包含检测重复请求的相关信息。
  2. Lab3测试耗时应在400秒,TestSnapshotSize3B测试应少于20秒。

发送和接收快照

事实上只需要改动接收applyCh的函数就好,在里面添加发送和接收快照的代码。

index表示KVServer应用的最后的日志,即msg.CommandIndexmsg.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看看是不是还有什么问题。

QQ截图20211116212852.png

最后,为了证明我不是在乱写,附上我的测试结果。