关于Tikv Raft snapshot apply的疑问

Tikv采用Raft作为一致性协议,确保多节点数据强一致性。 但是去学习代码的过程中有一个疑问,就是Tikv 的snapshot apply 实现依赖Rocksdb 的 IngestExternalFile API, 但是该API 经过测试并不会去清理DB中已经存在的老数据,而是类似于去追加或者覆盖数据。那么如下场景理论上会存在bug(因为不熟悉Rust所以没做Tikv实际测试):

1)基于Raft构建了3个节点Node1, Node2, Node3的Rocksdb复制组,三个节点有相同的1条数据 A 2)杀掉Node3 3)从复制组中删掉数据A,Node1,Node2上A被删除 4)等待Node1, Node2 打出Raft snapshot,并清理老的Raft Log 5)重新启动Node3, Node3 会apply Leader来的snapshot。因为Node3原来的DB里面存在数据A,但是Snapshot apply并不会删除老的数据A。这样实际上导致在Node3上数据并没有删除。如果Node3哪天成为新的Leader,会引起数据的不一致。

snapshot如果是ingest file会先清理旧数据