From e1286892e59a6ca2fc44a58473ca45292e623a10 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Wed, 11 Mar 2026 17:26:32 +0100 Subject: debug info page for db kv and cache kv --- kv/src/lib.rs | 6 ++++++ kv/src/rocksdb.rs | 35 ++++++++++++++++++++++++++++++++--- 2 files changed, 38 insertions(+), 3 deletions(-) (limited to 'kv') diff --git a/kv/src/lib.rs b/kv/src/lib.rs index 83f2635..dd30460 100644 --- a/kv/src/lib.rs +++ b/kv/src/lib.rs @@ -20,6 +20,9 @@ use anyhow::Result; pub trait Store: Send + Sync + 'static { fn transaction(&self, f: &mut dyn FnMut(&mut dyn Transaction) -> Result<()>) -> Result<()>; + fn debug_info(&self) -> Result { + Ok(String::new()) + } } pub trait Transaction { fn set(&mut self, key: &[u8], value: &[u8]) -> Result<()>; @@ -35,4 +38,7 @@ pub trait Transaction { pub trait BlobStorage: Send + Sync + 'static { fn store(&self, key: &str, value: &[u8]) -> Result<()>; fn read(&self, key: &str) -> Result>>; + fn debug_info(&self) -> Result { + Ok(String::new()) + } } diff --git a/kv/src/rocksdb.rs b/kv/src/rocksdb.rs index 683e399..04d7437 100644 --- a/kv/src/rocksdb.rs +++ b/kv/src/rocksdb.rs @@ -4,11 +4,17 @@ Copyright (C) 2026 metamuffin */ +use crate::{BlobStorage, Store, Transaction}; use anyhow::Result; +use humansize::{DECIMAL, SizeFormatter}; use rocksdb::{Direction, ErrorKind, IteratorMode, OptimisticTransactionDB}; -use std::path::Path; +use std::{ + path::Path, + sync::atomic::{AtomicU64, Ordering}, +}; -use crate::{BlobStorage, Store, Transaction}; +pub static NUM_TXN_COMMIT: AtomicU64 = AtomicU64::new(0); +pub static NUM_TXN_ATTEMPT: AtomicU64 = AtomicU64::new(0); pub fn new(path: &Path) -> Result { Ok(OptimisticTransactionDB::open_default(path)?) @@ -18,13 +24,29 @@ impl Store for OptimisticTransactionDB { fn transaction(&self, f: &mut dyn FnMut(&mut dyn Transaction) -> Result<()>) -> Result<()> { loop { let mut txn = self.transaction(); + NUM_TXN_ATTEMPT.fetch_add(1, Ordering::Relaxed); f(&mut txn)?; match txn.commit() { - Ok(()) => break Ok(()), + Ok(()) => break, Err(e) if e.kind() == ErrorKind::Busy => continue, Err(e) => return Err(e.into()), } } + NUM_TXN_COMMIT.fetch_add(1, Ordering::Relaxed); + Ok(()) + } + fn debug_info(&self) -> Result { + let size = self.get_approximate_sizes(&[rocksdb::Range::new(&[0x00], &[0xff])])[0]; + let attempts = NUM_TXN_ATTEMPT.load(Ordering::Relaxed); + let commits = NUM_TXN_COMMIT.load(Ordering::Relaxed); + let retry_factor = attempts as f64 / commits as f64; + Ok(format!( + "transactions attempted: {attempts:>12}\n\ + transactions commited: {commits:>12}\n\ + transactions retry factor: {retry_factor:>12.03}\n\ + approximate size on disk: {:>12}\n", + SizeFormatter::new(size, DECIMAL).to_string() + )) } } @@ -67,4 +89,11 @@ impl BlobStorage for OptimisticTransactionDB { fn read(&self, key: &str) -> Result>> { Ok(self.get(key)?) } + fn debug_info(&self) -> Result { + let size = self.get_approximate_sizes(&[rocksdb::Range::new(&[0x00], &[0xff])])[0]; + Ok(format!( + "approximate size on disk: {:>12}\n", + SizeFormatter::new(size, DECIMAL).to_string() + )) + } } -- cgit v1.3