risingwave_meta/hummock/compaction/selector/
space_reclaim_selector.rsuse std::collections::HashMap;
use risingwave_hummock_sdk::HummockCompactionTaskId;
use risingwave_pb::hummock::compact_task;
use super::{CompactionSelector, DynamicLevelSelectorCore};
use crate::hummock::compaction::picker::{SpaceReclaimCompactionPicker, SpaceReclaimPickerState};
use crate::hummock::compaction::selector::CompactionSelectorContext;
use crate::hummock::compaction::{create_compaction_task, CompactionTask};
#[derive(Default)]
pub struct SpaceReclaimCompactionSelector {
state: HashMap<u64, SpaceReclaimPickerState>,
}
impl CompactionSelector for SpaceReclaimCompactionSelector {
fn pick_compaction(
&mut self,
task_id: HummockCompactionTaskId,
context: CompactionSelectorContext<'_>,
) -> Option<CompactionTask> {
let CompactionSelectorContext {
group,
levels,
member_table_ids,
level_handlers,
developer_config,
..
} = context;
let dynamic_level_core =
DynamicLevelSelectorCore::new(group.compaction_config.clone(), developer_config);
let mut picker = SpaceReclaimCompactionPicker::new(
group.compaction_config.max_space_reclaim_bytes,
member_table_ids
.iter()
.map(|table_id| table_id.table_id)
.collect(),
);
let ctx = dynamic_level_core.calculate_level_base_size(levels);
let state = self.state.entry(group.group_id).or_default();
let compaction_input = picker.pick_compaction(levels, level_handlers, state)?;
compaction_input.add_pending_task(task_id, level_handlers);
Some(create_compaction_task(
dynamic_level_core.get_config(),
compaction_input,
ctx.base_level,
self.task_type(),
))
}
fn name(&self) -> &'static str {
"SpaceReclaimCompaction"
}
fn task_type(&self) -> compact_task::TaskType {
compact_task::TaskType::SpaceReclaim
}
}