6.824 lab2 Part C

一、实验说明

https://pdos.csail.mit.edu/6.824/labs/lab-raft.html

二、梳理

Part C要求Raft的服务器重新启动,则应在停止的位置恢复服务,Raft保持持久状态,使其在重启后能够重新运行。

代码中已经预留出了persist()和readPersist(),根据论文可以得知需要保存currentTerm, votedFor, snapshottedIndex三个变量

func (rf *Raft) persist() {
	w := new(bytes.Buffer)
	e := labgob.NewEncoder(w)
	e.Encode(rf.currentTerm)
	e.Encode(rf.votedFor)
	e.Encode(rf.logs)
	data := w.Bytes()
	rf.persister.SaveRaftState(data)
}
func (rf *Raft) readPersist(data []byte) {
	if data == nil || len(data) < 1 { // bootstrap without any state?
		return
	}
	r := bytes.NewBuffer(data)
	d := labgob.NewDecoder(r)
	var currentTerm, votedFor int
	var logs []LogEntry
	if d.Decode(&currentTerm) != nil ||
		d.Decode(&votedFor) != nil ||
		d.Decode(&logs) != nil {
		DPrintf("%v fails to recover from persist", rf)
		return
	}

	rf.currentTerm = currentTerm
	rf.votedFor = votedFor
	rf.logs = logs
}

readPersist()

  • Make()初始化的时候添加
rf.mu.Lock()
rf.readPersist(persister.ReadRaftState())
rf.mu.Unlock()

persist()

  • AppendEntries()和RequestVote()结束时
  • Start()新增LogEntry 时
  • sendAppendEntries返回term大于当前term
  • sebdRequestVote返回term大于当前term
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值