diff options
Diffstat (limited to 'kv/src/bin/rocksdb_stats.rs')
| -rw-r--r-- | kv/src/bin/rocksdb_stats.rs | 50 |
1 files changed, 50 insertions, 0 deletions
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 <metamuffin.org> +*/ + +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<String, (u64, u64)> = 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::<Vec<_>>(); + 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(()) +} |