这里主要分析LevelCompactionBuilder::PickCompaction是如何选择输入文件的。
SetupInitialFiles();找一个需要compact到下层的SST file。只会在score >= 1的level里找。score的计算见VersionStorageInfo::ComputeCompactionScore(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,expandoutput_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。