aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2026-03-07 02:58:30 +0100
committermetamuffin <metamuffin@disroot.org>2026-03-07 02:58:30 +0100
commitb306e65ddf91c97f5bf6f751122c7b87db233443 (patch)
tree25a74da072c59b5c71e559704c8986213e21b583
parenta93e0bf8db710ef9dcd40e1526ddd4b18a7288e9 (diff)
downloadjellything-b306e65ddf91c97f5bf6f751122c7b87db233443.tar
jellything-b306e65ddf91c97f5bf6f751122c7b87db233443.tar.bz2
jellything-b306e65ddf91c97f5bf6f751122c7b87db233443.tar.zst
rocksdb cache stats tool
-rw-r--r--kv/src/bin/rocksdb_stats.rs50
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(())
+}