overflowNameSpaceSet的更改不能达到目的
cn.edu.tsinghua.iotdb.engine.filenode.FileNodeManager中,addNameSpaceToOverflowList函数会在每个FileNode增删改操作时被执行,overflowNameSpaceSet中是当前所有被更改过的nameSpacePath。
但是,overflowBackUpAction和overflowFlushAction两个函数(line62,72)是在某个FileNode的flush之前先备份一下,flush结束后刷写备份前的set,这样做似乎欠考虑。
addNameSpaceToOverflowList是必须是每次overflow操作的时候都应该被调用,并且把这次overflow操作对应的FileNodePath记录下来(记录到overflowNameSpaceSet)。所以overflowNameSpaceSet记录的是当前内存中的overflow内容,当需要把当前内存中的overflow数据写入磁盘之前需要把overflowNameSpaceSet中的内容添加到所有已经写入到磁盘的内容中去。并且这个过程要分解成两个阶段:
1.第一个阶段是把overflowNameSpaceSet的内容添加到backUpOverflowNameSpaceSet中(flush数据前)
2.第二个阶段是把backUpOverflowNameSpaceSet的内容写入到磁盘中。(flush数据以后)
原本实现方式导致的问题是:某个FileNode对应的overflow并没有flush,但是其对应的FileNodePath已经被备份到磁盘中。恢复的时候会造成某些没有overflow数据的FileNode被标记为有overflow数据。
改进方法:
overflowBackUpAction调用需要传入参数,其中参数为某个FileNodePath,这样,每次只把对应需要flush overflow数据的FileNode添加到backupset中。