aboutsummaryrefslogtreecommitdiff
path: root/kv
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2026-03-11 17:26:32 +0100
committermetamuffin <metamuffin@disroot.org>2026-03-11 17:26:32 +0100
commite1286892e59a6ca2fc44a58473ca45292e623a10 (patch)
tree36389b06f5be667e4f13cfb1e62db4d228e75343 /kv
parent578b32c9119692fb049fa56c7d52f2fbb8d485d7 (diff)
downloadjellything-e1286892e59a6ca2fc44a58473ca45292e623a10.tar
jellything-e1286892e59a6ca2fc44a58473ca45292e623a10.tar.bz2
jellything-e1286892e59a6ca2fc44a58473ca45292e623a10.tar.zst
debug info page for db kv and cache kv
Diffstat (limited to 'kv')
-rw-r--r--kv/src/lib.rs6
-rw-r--r--kv/src/rocksdb.rs35
2 files changed, 38 insertions, 3 deletions
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<String> {
+ 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<Option<Vec<u8>>>;
+ fn debug_info(&self) -> Result<String> {
+ 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 <metamuffin.org>
*/
+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<OptimisticTransactionDB> {
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<String> {
+ 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<Option<Vec<u8>>> {
Ok(self.get(key)?)
}
+ fn debug_info(&self) -> Result<String> {
+ 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()
+ ))
+ }
}