看了https://pingcap.com/zh/blog/tikv-source-code-reading-21 关于Merge的源码解析博客,有一个问题没有弄清楚。
我目前理解,source peer需要在PrepareMerge日志进入Apply之后,才会向本地的target peer发起CommitMerge请求,然后不断通过merge tick推动target完成合并;target peer本身并不会主动向source peer发送消息补全日志。
那么假设有一个source peer,在多数派Apply PrepareMerge之前它就挂掉了甚至没收到PrepareMerge的日志;那么多数派都进入了CommitMerge阶段,并且完成了Merge、删除对应store上的source peer之后,这个孤立的节点重启,这时它是如何追上merge过程的呢?如果它日志里没有包含PrepareMerge,那么它也就不会向本地target peer发起merge tick,虽然本地source peer持有它所需的日志,但是source peer又不会主动补全它缺失的部分?具体的实现是怎么做的呢?