fn pick_compaction_files()

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
    }