···11+use clap::Parser;
22+use fjall::{Config, PartitionCreateOptions};
33+use std::path::PathBuf;
44+use std::time::Instant;
55+66+#[derive(Parser)]
77+#[command(about = "Run a major compaction over every ufos partition")]
88+struct Cli {
99+ /// path to the fjall data directory
1010+ ///
1111+ /// WARNING: MUST NOT RUN WHILE ANOTHER UFOS PROCESS IS USING IT
1212+ data: PathBuf,
1313+}
1414+1515+fn main() -> anyhow::Result<()> {
1616+ let cli = Cli::parse();
1717+1818+ eprintln!("opening db at {:?}...", cli.data);
1919+ let keyspace = Config::new(&cli.data).open()?;
2020+2121+ for name in ["global", "feeds", "records", "rollups", "queues"] {
2222+ let partition = keyspace.open_partition(name, PartitionCreateOptions::default())?;
2323+ let size0 = partition.disk_space();
2424+ eprintln!("beginning major compaction for {name} (original size: {size0})");
2525+ let t0 = Instant::now();
2626+ partition.major_compact()?;
2727+ let dt = t0.elapsed();
2828+ let sizef = partition.disk_space();
2929+ let dsize = (sizef as i64) - (size0 as i64);
3030+ eprintln!("completed compaction for {name} in {dt:?} (new size: {sizef}, {dsize})");
3131+ }
3232+3333+ Ok(())
3434+}