tinykv Project2c完成记录

发布时间 2023-05-21 23:05:58作者: 还能再学一小时

tinykv project2C 学习记录

1. 理清流程

1. log剪裁过程

  1. 当onRaftGcLogTick()时,Raftstore检查当前Log是否超过RaftLogGcCountLimit
  2. 如果是,则先propose一个admin command(CompactLogRequest)到raft中,直到该command被commit之后,raftstore开始处理LogGc
    • 为什么要propose到raft中去而不是直接进行gc?
      • answer: 需要通知所有follower都进行log的裁剪
    • follower的log会不会不够长呢?
      • 不会 当该log被commit之后,就说明该follower一定拥有所有之前的log且已经进行了持久化了,可以被清理
  3. Raftstore首先更新PeerStorage中的meta信息,主要是RaftApplyState中的RaftTruncatedState信息。
  4. 接着Raftstore先将内存中的RaftLog进行剪裁,再分配任务给raftlog-gc worker来进行异步的删除log操作

2. raft中snapshot的操作

  1. 当进行append和heartbeat操作时,接受到resp发现follower所需要的log已经被裁减了,则向Storage获取snapshot,并发送snapshot message
  2. follower接收到snapshot后,需要将snapshot的meta信息记录到raft中。主要是将baseIndex修改
  3. 同时snapshot还会包含conf信息,用于同步最新的region信息
    • 为什么要有region信息
      • answer:因为可能有changeConf的cmd包含在snapshot中,所以需要Conf信息来同步region信息给滞后的follower

3. 上层接收到snapshot是如何处理的

  1. 当follower同步了raft的meta信息后,会将snapshot随ready交由raftstore进行处理。