Skip to content

Commit

Permalink
adding compaction from lib
Browse files Browse the repository at this point in the history
  • Loading branch information
rubend056 committed May 31, 2024
1 parent cd17933 commit 77309a0
Showing 1 changed file with 44 additions and 1 deletion.
45 changes: 44 additions & 1 deletion src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -167,9 +167,52 @@ impl<'a> From<(Bound<Cow<'a, str>>, Bound<Cow<'a, str>>)> for CowStringRange<'a>
}
}

/// Perform a compaction of the DB.
///
/// Written for use with downstream crates needing periodic
/// compactions.
pub fn compact(dir: &std::path::Path, major: bool) -> std::io::Result<()> {
use fs2::FileExt;
let lock = std::fs::File::create(dir.join(".compact"))?;
lock.try_lock_exclusive()?;

let db = if major {
DatabaseReader::new(dir)?
} else {
DatabaseReader::without_main_db(dir)?
};

let mut no_transaction_paths = false;
{
let ps = db.transaction_paths();
if ps.len() == 1 && ps[0].file_name().expect("filename") == "main" {
no_transaction_paths = true;
}
}

if db.num_txes() <= 1 || no_transaction_paths {
println!("Compaction has nothing to do.");
} else {
println!("Processing {} .txes", db.num_txes());
let db = std::sync::Arc::new(db);
let mut compacted = CreateTx::new(dir)?;

// create the new transaction after opening the database reader
let reader = db.get_range(..);
let mut n = 0u64;
for record in reader {
compacted.add_record_raw(record.key(), record.format(), record.raw()).expect("Error adding record");
n += 1;
}
_purge_compacted_files(compacted, dir, &db, major)?;
println!("Compacted {} records.", {n});
}

Ok(())
}

// not part of public api
#[doc(hidden)]
#[cfg(feature = "bin")]
pub fn _purge_compacted_files(
compacted: CreateTx,
dir: &std::path::Path,
Expand Down

0 comments on commit 77309a0

Please sign in to comment.