Skip to main content

tuwunel_database/map/
compact.rs

1use rocksdb::{BottommostLevelCompaction, CompactOptions};
2use tuwunel_core::{Err, Result, implement};
3
4use crate::keyval::KeyBuf;
5
6#[derive(Clone, Debug, Default)]
7pub struct Options {
8	/// Key range to start and stop compaction.
9	pub range: (Option<KeyBuf>, Option<KeyBuf>),
10
11	/// (None, None) - all levels to all necessary levels
12	/// (None, Some(1)) - compact all levels into level 1
13	/// (Some(1), None) - compact level 1 into level 1
14	/// (Some(_), Some(_) - currently unsupported
15	pub level: (Option<usize>, Option<usize>),
16
17	/// run compaction until complete. if false only one pass is made, and the
18	/// results of that pass are not further recompacted.
19	pub exhaustive: bool,
20
21	/// waits for other compactions to complete, then runs this compaction
22	/// exclusively before allowing automatic compactions to resume.
23	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}