tuwunel_database/map/
compact.rs1use rocksdb::{BottommostLevelCompaction, CompactOptions};
2use tuwunel_core::{Err, Result, implement};
3
4use crate::keyval::KeyBuf;
5
6#[derive(Clone, Debug, Default)]
7pub struct Options {
8 pub range: (Option<KeyBuf>, Option<KeyBuf>),
10
11 pub level: (Option<usize>, Option<usize>),
16
17 pub exhaustive: bool,
20
21 pub exclusive: bool,
24}
25
26#[implement(super::Map)]
27#[tracing::instrument(
28 name = "compact",
29 level = "info"
30 skip(self),
31 fields(%self),
32)]
33pub fn compact_blocking(&self, opts: Options) -> Result {
34 let mut co = CompactOptions::default();
35 co.set_exclusive_manual_compaction(opts.exclusive);
36 co.set_bottommost_level_compaction(match opts.exhaustive {
37 | true => BottommostLevelCompaction::Force,
38 | false => BottommostLevelCompaction::ForceOptimized,
39 });
40
41 match opts.level {
42 | (None, None) => {
43 co.set_change_level(true);
44 co.set_target_level(-1);
45 },
46 | (None, Some(level)) => {
47 co.set_change_level(true);
48 co.set_target_level(level.try_into()?);
49 },
50 | (Some(level), None) => {
51 co.set_change_level(false);
52 co.set_target_level(level.try_into()?);
53 },
54 | (Some(_), Some(_)) => return Err!("compacting between specific levels not supported"),
55 }
56
57 self.engine
58 .db
59 .compact_range_cf_opt(&self.cf(), opts.range.0, opts.range.1, &co);
60
61 Ok(())
62}