From 37471a063fc2bca3ef42d6cc2eeaf91f85c3037b Mon Sep 17 00:00:00 2001 From: Tglman Date: Tue, 24 Aug 2021 19:29:48 +0100 Subject: [PATCH] updated to persy 1.0 --- Cargo.lock | 29 +++++++++++++------------ Cargo.toml | 2 +- src/database/abstraction/persy.rs | 36 ++++++++++++++++++------------- src/error.rs | 14 ++++++++---- 4 files changed, 47 insertions(+), 34 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 43d9857..1843139 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -170,12 +170,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "build_const" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ae4235e6dac0694637c763029ecea1a2ec9e4e06ec2729bd21ba4d9c863eb7" - [[package]] name = "bumpalo" version = "3.7.0" @@ -342,13 +336,19 @@ dependencies = [ [[package]] name = "crc" -version = "1.8.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb" +checksum = "10c2722795460108a7872e1cd933a85d6ec38abc4baecad51028f702da28889f" dependencies = [ - "build_const", + "crc-catalog", ] +[[package]] +name = "crc-catalog" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccaeedb56da03b09f598226e25e80088cb4cd25f316e6e4df7d695f0feeb1403" + [[package]] name = "crc32fast" version = "1.2.1" @@ -1644,16 +1644,17 @@ checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" [[package]] name = "persy" -version = "0.11.13" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cc96c7b02a7abb1df713f326c4deb493ce2b72155935d3e6ed0ba24bd9e778d" +checksum = "de4cd9bda96e9bab3c961620ca512def7a7a880152780132632506abe4414458" dependencies = [ "byteorder", "crc", "data-encoding", "fs2", "linked-hash-map", - "rand 0.7.3", + "rand 0.8.4", + "thiserror", "unsigned-varint", "zigzag", ] @@ -3279,9 +3280,9 @@ checksum = "f14ee04d9415b52b3aeab06258a3f07093182b88ba0f9b8d203f211a7a7d41c7" [[package]] name = "unsigned-varint" -version = "0.5.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7fdeedbf205afadfe39ae559b75c3240f24e257d0ca27e85f85cb82aa19ac35" +checksum = "5f8d425fafb8cd76bc3f22aace4af471d3156301d7508f2107e98fbeae10bc7f" [[package]] name = "untrusted" diff --git a/Cargo.toml b/Cargo.toml index cc8f125..659a50a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -28,7 +28,7 @@ tokio = "1.8.2" # Used for storing data permanently sled = { version = "0.34.6", features = ["compression", "no_metrics"], optional = true } #sled = { git = "https://github.com/spacejam/sled.git", rev = "e4640e0773595229f398438886f19bca6f7326a2", features = ["compression"] } -persy = { version = "0.11", optional = true } +persy = { version = "1.0", optional = true } # Used by the persy write cache for background flush timer = "0.2" chrono = "0.4" diff --git a/src/database/abstraction/persy.rs b/src/database/abstraction/persy.rs index d594811..9d3ca26 100644 --- a/src/database/abstraction/persy.rs +++ b/src/database/abstraction/persy.rs @@ -56,7 +56,7 @@ impl DatabaseEngine for PersyEngine { // Create if it doesn't exist if !self.persy.exists_index(name)? { let mut tx = self.persy.begin()?; - tx.create_index::(name, ValueMode::REPLACE)?; + tx.create_index::(name, ValueMode::Replace)?; tx.prepare()?.commit()?; } @@ -187,15 +187,15 @@ impl WriteCache { for (key, value) in changes { tx.put::( &index, - ByteVec(key.to_owned()), - ByteVec(value.to_owned()), + ByteVec::new(key.to_owned()), + ByteVec::new(value.to_owned()), )?; } } self.add_cache.clear(); for (index, changes) in &self.remove_cache { for key in changes { - tx.remove::(&index, ByteVec(key.to_owned()), None)?; + tx.remove::(&index, ByteVec::new(key.to_owned()), None)?; } } self.remove_cache.clear(); @@ -356,9 +356,9 @@ impl Tree for PersyTree { fn get(&self, key: &[u8]) -> Result>> { let result = self .persy - .get::(&self.name, &ByteVec(key.to_vec()))? - .map(|v| v.into_iter().map(|bv| bv.0).next()) - .flatten(); + .get::(&self.name, &ByteVec::new(key.to_vec()))? + .next() + .map(|v| (*v).to_owned()); let result = self .write_cache .read() @@ -396,7 +396,6 @@ impl Tree for PersyTree { Ok(()) } - #[tracing::instrument(skip(self, iter))] fn insert_batch<'a>(&self, iter: &mut dyn Iterator, Vec)>) -> Result<()> { //TODO: evaluate if use instead a single big transaction for (key, value) in iter { @@ -406,6 +405,13 @@ impl Tree for PersyTree { Ok(()) } + fn increment_batch<'a>(&self, iter: &mut dyn Iterator>) -> Result<()> { + for key in iter { + self.increment(&key)?; + } + Ok(()) + } + fn remove(&self, key: &[u8]) -> Result<()> { self.write_cache .write() @@ -420,7 +426,7 @@ impl Tree for PersyTree { Ok(iter) => { let result = Box::new(iter.filter_map(|(k, v)| { v.into_iter() - .map(|val| (k.0.to_owned().into(), val.0.to_owned().into())) + .map(|val| ((*k).to_owned().into(), (*val).to_owned().into())) .next() })); @@ -440,16 +446,16 @@ impl Tree for PersyTree { ) -> Box, Vec)> + 'a> { let range = if backwards { self.persy - .range::(&self.name, ..ByteVec(from.to_owned())) + .range::(&self.name, ..ByteVec::new(from.to_owned())) } else { self.persy - .range::(&self.name, ByteVec(from.to_owned())..) + .range::(&self.name, ByteVec::new(from.to_owned())..) }; match range { Ok(iter) => { let map = iter.filter_map(|(k, v)| { v.into_iter() - .map(|val| (k.0.to_owned().into(), val.0.to_owned().into())) + .map(|val| ((*k).to_owned().into(), (*val).to_owned().into())) .next() }); let result: Box, Vec)> + Send + 'a> = if backwards @@ -482,7 +488,7 @@ impl Tree for PersyTree { &'a self, prefix: Vec, ) -> Box, Vec)> + 'a> { - let range_prefix = ByteVec(prefix.to_owned()); + let range_prefix = ByteVec::new(prefix.to_owned()); let range = self .persy .range::(&self.name, range_prefix..); @@ -491,10 +497,10 @@ impl Tree for PersyTree { Ok(iter) => { let owned_prefix = prefix.clone(); let result = Box::new( - iter.take_while(move |(k, _)| k.0.starts_with(&owned_prefix)) + iter.take_while(move |(k, _)| (*k).starts_with(&owned_prefix)) .filter_map(|(k, v)| { v.into_iter() - .map(|val| (k.0.to_owned().into(), val.0.to_owned().into())) + .map(|val| ((*k).to_owned().into(), (*val).to_owned().into())) .next() }), ); diff --git a/src/error.rs b/src/error.rs index 63d3b21..ef135fe 100644 --- a/src/error.rs +++ b/src/error.rs @@ -1,3 +1,4 @@ +use persy::PersyError; use ruma::{ api::client::{ error::{Error as RumaError, ErrorKind}, @@ -38,10 +39,7 @@ pub enum Error { }, #[cfg(feature = "persy")] #[error("There was a problem with the connection to the persy database.")] - PersyError { - #[from] - source: persy::PersyError, - }, + PersyError { source: persy::PersyError }, #[cfg(feature = "heed")] #[error("There was a problem with the connection to the heed database: {error}")] HeedError { error: String }, @@ -142,3 +140,11 @@ where self.to_response().respond_to(r) } } + +impl> From> for Error { + fn from(err: persy::PE) -> Self { + Error::PersyError { + source: err.error().into(), + } + } +}