From b306e65ddf91c97f5bf6f751122c7b87db233443 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Sat, 7 Mar 2026 02:58:30 +0100 Subject: rocksdb cache stats tool --- kv/src/bin/rocksdb_stats.rs | 50 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 kv/src/bin/rocksdb_stats.rs diff --git a/kv/src/bin/rocksdb_stats.rs b/kv/src/bin/rocksdb_stats.rs new file mode 100644 index 0000000..57724ed --- /dev/null +++ b/kv/src/bin/rocksdb_stats.rs @@ -0,0 +1,50 @@ +/* + This file is part of jellything (https://codeberg.org/metamuffin/jellything) + which is licensed under the GNU Affero General Public License (version 3); see /COPYING. + Copyright (C) 2026 metamuffin +*/ + +use anyhow::Result; +use humansize::{DECIMAL, SizeFormatter}; +use rocksdb::DB; +use std::{ + cmp::Reverse, + collections::BTreeMap, + env::args, + io::{Write, stdout}, +}; + +fn main() -> Result<()> { + let db = DB::open_default(args().nth(1).unwrap())?; + let mut dirs: BTreeMap = BTreeMap::new(); + + let mut total = 0; + for r in db.prefix_iterator(&[]) { + let (k, v) = r?; + let mut k = String::from_utf8(k.to_vec()).unwrap(); + while !k.ends_with("/") { + k.pop(); + } + let (count, size) = dirs.entry(k).or_default(); + total += 1; + *count += 1; + *size += v.len() as u64; + if total % 1234 == 0 { + print!("{total:>9}\r"); + stdout().flush().unwrap(); + } + } + + let mut dirs = dirs.into_iter().collect::>(); + dirs.sort_by_key(|(_, (_, x))| Reverse(*x)); + + for (dir, (count, size)) in dirs { + eprintln!( + "{dir: <30} {count:>9} {:>12}", + SizeFormatter::new(size, DECIMAL).to_string() + ) + } + + db.flush()?; + Ok(()) +} -- cgit v1.3