diff options
author | Alex Auvolat <alex@adnab.me> | 2022-12-15 17:11:00 +0100 |
---|---|---|
committer | Alex Auvolat <alex@adnab.me> | 2022-12-15 17:11:00 +0100 |
commit | 4756db4d29d0c54fda9d264ca777ccf50273d83e (patch) | |
tree | 09cc36252d6bff4737b38837894297ba14e46c91 /src/db | |
parent | 1fcd0b371ba1fa94cd6efad5aa9a236b2e58c922 (diff) | |
download | garage-4756db4d29d0c54fda9d264ca777ccf50273d83e.tar.gz garage-4756db4d29d0c54fda9d264ca777ccf50273d83e.zip |
wip: dump waaaaaay too much stuffdb-debug-log
Diffstat (limited to 'src/db')
-rw-r--r-- | src/db/Cargo.toml | 7 | ||||
-rw-r--r-- | src/db/lib.rs | 52 | ||||
-rw-r--r-- | src/db/sled_adapter.rs | 9 |
3 files changed, 65 insertions, 3 deletions
diff --git a/src/db/Cargo.toml b/src/db/Cargo.toml index 82cf49dc..a0034169 100644 --- a/src/db/Cargo.toml +++ b/src/db/Cargo.toml @@ -18,6 +18,7 @@ required-features = ["cli"] [dependencies] err-derive = "0.3" +hex = "0.4" hexdump = "0.1" tracing = "0.1.30" @@ -25,6 +26,11 @@ heed = { version = "0.11", default-features = false, features = ["lmdb"], option rusqlite = { version = "0.27", optional = true } sled = { version = "0.34", optional = true } +rmp-serde = { version = "0.15", optional = true } +serde = { version = "1.0", default-features = false, features = ["derive", "rc"], optional = true } +serde-transcode = { version = "1.1", optional = true } +nettext = { version = "0.3.2", default-features = false, features = ["serde"], optional = true, path = "../../../nettext" } + # cli deps clap = { version = "3.1.18", optional = true, features = ["derive", "env"] } pretty_env_logger = { version = "0.4", optional = true } @@ -38,3 +44,4 @@ bundled-libs = [ "rusqlite/bundled" ] cli = ["clap", "pretty_env_logger"] lmdb = [ "heed" ] sqlite = [ "rusqlite" ] +debuglog = [ "serde", "rmp-serde", "nettext", "serde-transcode" ] diff --git a/src/db/lib.rs b/src/db/lib.rs index 11cae4e3..cd2774fa 100644 --- a/src/db/lib.rs +++ b/src/db/lib.rs @@ -174,8 +174,21 @@ impl Tree { } #[inline] + pub fn name(&self) -> Option<String> { + self.0.tree_name(self.1) + } + + #[inline] pub fn get<T: AsRef<[u8]>>(&self, key: T) -> Result<Option<Value>> { - self.0.get(self.1, key.as_ref()) + let res = self.0.get(self.1, key.as_ref())?; + #[cfg(feature = "debuglog")] + debuglog( + self.name(), + "GET", + key.as_ref(), + res.as_deref().unwrap_or(b"-"), + ); + Ok(res) } #[inline] pub fn len(&self) -> Result<usize> { @@ -204,7 +217,10 @@ impl Tree { key: T, value: U, ) -> Result<Option<Value>> { - self.0.insert(self.1, key.as_ref(), value.as_ref()) + let res = self.0.insert(self.1, key.as_ref(), value.as_ref())?; + #[cfg(feature = "debuglog")] + debuglog(self.name(), "PUT", key.as_ref(), value.as_ref()); + Ok(res) } /// Returns the old value if there was one #[inline] @@ -267,7 +283,10 @@ impl<'a> Transaction<'a> { key: T, value: U, ) -> TxOpResult<Option<Value>> { - self.0.insert(tree.1, key.as_ref(), value.as_ref()) + let res = self.0.insert(tree.1, key.as_ref(), value.as_ref())?; + #[cfg(feature = "debuglog")] + debuglog(tree.name(), "txPUT", key.as_ref(), value.as_ref()); + Ok(res) } /// Returns the old value if there was one #[inline] @@ -324,6 +343,7 @@ pub(crate) trait IDb: Send + Sync { fn engine(&self) -> String; fn open_tree(&self, name: &str) -> Result<usize>; fn list_trees(&self) -> Result<Vec<String>>; + fn tree_name(&self, tree: usize) -> Option<String>; fn get(&self, tree: usize, key: &[u8]) -> Result<Option<Value>>; fn len(&self, tree: usize) -> Result<usize>; @@ -421,3 +441,29 @@ fn get_bound<K: AsRef<[u8]>>(b: Bound<&K>) -> Bound<&[u8]> { Bound::Unbounded => Bound::Unbounded, } } + +#[cfg(feature = "debuglog")] +fn debuglog(tree: Option<String>, action: &str, k: &[u8], v: &[u8]) { + let key = String::from_utf8(nettext::switch64::encode(k, false)).unwrap(); + let tree = tree.as_deref().unwrap_or("(?)"); + if let Ok(vstr) = std::str::from_utf8(v) { + eprintln!("{} {} {} S:{}", tree, action, key, vstr); + } else { + let mut vread = &v[..]; + let mut vder = rmp_serde::decode::Deserializer::new(&mut vread); + let mut vser = nettext::serde::Serializer { + string_format: nettext::BytesEncoding::Switch64 { + allow_whitespace: true, + }, + bytes_format: nettext::BytesEncoding::Hex { split: true }, + }; + if let Some(venc) = serde_transcode::transcode(&mut vder, &mut vser) + .ok() + .and_then(|x| String::from_utf8(x.encode_concise()).ok()) + { + eprintln!("{} {} {} N:{}", tree, action, key, venc); + } else { + eprintln!("{} {} {} X:{}", tree, action, key, hex::encode(v)); + } + } +} diff --git a/src/db/sled_adapter.rs b/src/db/sled_adapter.rs index cf61867d..31a4889f 100644 --- a/src/db/sled_adapter.rs +++ b/src/db/sled_adapter.rs @@ -88,6 +88,15 @@ impl IDb for SledDb { Ok(trees) } + fn tree_name(&self, tree: usize) -> Option<String> { + self.trees + .read() + .unwrap() + .0 + .get(tree) + .and_then(|x| String::from_utf8(x.name().to_vec()).ok()) + } + // ---- fn get(&self, tree: usize, key: &[u8]) -> Result<Option<Value>> { |