RocksDB代码分析——Compaction的输入文件的选择

这里主要分析LevelCompactionBuilder::PickCompaction是如何选择输入文件的。

SetupInitialFiles();找一个需要compact到下层的SST file。只会在score >= 1的level里找。score的计算见VersionStorageInfo::ComputeCompactionScore({% post_link Storage/'RocksDB代码分析——Compaction流程' %})。
LevelCompactionBuilder::SetupOtherL0FilesIfNeeded

CompactionPicker::GetOverlappingL0Files

CompactionPicker::GetRange,拿到这个file的smallest和largest
VersionStorageInfo::GetOverlappingInputs,拿到L0中所有跟[smallest, largest] overlap的file。
然后再CompactionPicker::GetRange更新一下range,检查一下冲突。然后不再继续get overlapping L0 files了。

LevelCompactionBuilder::SetupOtherInputsIfNeeded

CompactionPicker::SetupOtherInputs

VersionStorageInfo::GetOverlappingInputs,把所有跟start_level_inputs相交的下一层的sst file都加入到output_level_inputs_里。
CompactionPicker::ExpandInputsToCleanCut,expand output_level_inputs_ 直到clean cut。
扩大start_level_inputs,只要不会扩大output_level_inputs_。细节:首先尝试把所有跟output_level_inputs相交的start level的sst file都放入input,然后看会不会导致output_level_inputs_变大,如果会的话,就再尝试所有在output_level_inputs_范围内的所有start level的sst file都放入input。

posted @ 2024-09-28 13:39  寻找繁星  阅读(3)  评论(0编辑  收藏  举报