TinyKv 2C中,raft层的leader是如何完成GC的?

通过查看peer_msg_handler可知,应用层会定期调用gc ticker,当发现日志数超过gc limit,会发送一条adminrequest请求。raft层propose并commit这个请求后,应用层会调用handleRaftReady来处理这个请求。
接下来文档要求我们实现在应用层,更新peerstorage的metadata,并且schedule一次GC。
我的理解是,gc完成后,应用层会生成一个snapshot。当snapshot生成完成后,需要将这个snapshot固定到Raft的badger中,然后再通知raft层截断日志,更新自己状态。
raft层里面唯一的相关代码是Step时,会受到snap类型的命令,我理解的是,这是由leader发送给follower的命令,但是我没有找到物理层将snapshot发送到raft层的相关代码,请问这部分逻辑是如何实现的?

我的理解是这样的,在 gc 完成之后,应用层不会主动生成快照。具体可以看 kv/runner/raftlog_gc.go//handle()gc 只是对本地 raftdb中的日志项执行了删除,没有生成快照这一过程。

快照的产生是在 raft.go 中,Leader 想要发送 Follower 需要的日志项,但是却发现自己没有这个日志项(可能是执行了 RaftLogGC 造成前面的日志项没有了),这个时候就会调用 RaftLog.Storage.Snapshot() 来产生快照,发送给 Follower

5 个赞

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。