use txn_db::{Db, TxnError};
fn main() -> Result<(), TxnError> {
let db = Db::new();
for v in 0..1_000u32 {
let mut tx = db.begin();
tx.put(b"counter".to_vec(), v.to_le_bytes().to_vec());
tx.commit()?;
}
let pinned = db.snapshot();
for v in 1_000..1_500u32 {
let mut tx = db.begin();
tx.put(b"counter".to_vec(), v.to_le_bytes().to_vec());
tx.commit()?;
}
let reclaimed_while_pinned = db.collect_garbage();
println!("reclaimed while a snapshot is held: {reclaimed_while_pinned}");
println!("snapshot still reads its value: {}", read(&pinned)?);
drop(pinned);
let reclaimed_after = db.collect_garbage();
println!("reclaimed after releasing the snapshot: {reclaimed_after}");
let latest = db.snapshot();
println!("latest value: {}", read(&latest)?);
println!("reclaimed on a second pass: {}", db.collect_garbage());
Ok(())
}
fn read(snap: &txn_db::Snapshot) -> Result<u32, TxnError> {
let value = snap.get(b"counter")?.expect("counter exists");
let mut buf = [0u8; 4];
buf.copy_from_slice(&value[..4]);
Ok(u32::from_le_bytes(buf))
}