通过查看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 分钟后被自动关闭。不再允许新回复。