在 TiKV 源码解析系列文章(十八)Raft Propose 的 Commit 和 Apply 情景分析 这篇文章末尾有如下一段描述:
这里存在一个特殊情况,就是所谓的“空日志”。在 raft-rs 的实现中,当选举出新的 Leader 时,新 Leader 会广播一条“空日志”,以提交前面 term 中的日志(详情请见 Raft 论文)。此时,可能还有一些在前面 term 中提出的 proposal 仍然处于 pending 阶段,而因为有新 Leader 产生,这些 proposal 永远不可能被确认了,因此我们需要对它们进行清理,以免关联的
callback
无法调用导致一些资源无法释放。清理的逻辑参照ApplyFsm::handle_entries_normal
函数。
这里提到 —— “可能还有一些在前面 term 中提出的 proposal 仍然处于 pending 阶段,而因为有新 Leader 产生,这些 proposal 永远不可能被确认了” ,我的疑问是这些 proposal 不应该是在这个 leader 上一次 lost leadershipt 的时候就清理掉直接返回 StaleCommand 错误,而是要等到再次当选 leader 了才清理?