in src/columnar_storage/src/compaction/picker.rs [155:188]
fn pick_compaction_files(
&self,
files_by_segment: BTreeMap<Timestamp, Vec<SstFile>>,
) -> Option<Vec<SstFile>> {
for (segment, mut files) in files_by_segment.into_iter().rev() {
trace!(segment = ?segment, files = ?files.len(), "Loop segment for pick files");
if files.len() < self.input_sst_min_num {
continue;
}
// Prefer to compact smaller files first.
files.sort_unstable_by_key(SstFile::size);
trace!(sorted_files = ?files, "Sort files by size");
let mut input_size = 0;
// Suppose the comaction will reduce the size of files by 10%.
let memory_limit = (self.new_sst_max_size as f64 * 1.1) as u64;
let compaction_files = files
.into_iter()
.take(self.input_sst_max_num)
.take_while(|f| {
input_size += f.size() as u64;
input_size <= memory_limit
})
.collect::<Vec<_>>();
if compaction_files.len() >= self.input_sst_min_num {
return Some(compaction_files);
}
}
None
}