tinykv project2C 学习记录
1. 理清流程
1. log剪裁过程
- 当onRaftGcLogTick()时,Raftstore检查当前Log是否超过RaftLogGcCountLimit
- 如果是,则先propose一个admin command(CompactLogRequest)到raft中,直到该command被commit之后,raftstore开始处理LogGc
- 为什么要propose到raft中去而不是直接进行gc?
- answer: 需要通知所有follower都进行log的裁剪
- follower的log会不会不够长呢?
- 不会 当该log被commit之后,就说明该follower一定拥有所有之前的log且已经进行了持久化了,可以被清理
- 为什么要propose到raft中去而不是直接进行gc?
- Raftstore首先更新PeerStorage中的meta信息,主要是RaftApplyState中的RaftTruncatedState信息。
- 接着Raftstore先将内存中的RaftLog进行剪裁,再分配任务给raftlog-gc worker来进行异步的删除log操作
2. raft中snapshot的操作
- 当进行append和heartbeat操作时,接受到resp发现follower所需要的log已经被裁减了,则向Storage获取snapshot,并发送snapshot message
- follower接收到snapshot后,需要将snapshot的meta信息记录到raft中。主要是将baseIndex修改
- 同时snapshot还会包含conf信息,用于同步最新的region信息
- 为什么要有region信息
- answer:因为可能有changeConf的cmd包含在snapshot中,所以需要Conf信息来同步region信息给滞后的follower
- 为什么要有region信息
3. 上层接收到snapshot是如何处理的
- 当follower同步了raft的meta信息后,会将snapshot随ready交由raftstore进行处理。