Browse Source

updated to persy 1.0

merge-requests/107/merge^2
Tglman 4 years ago
parent
commit
37471a063f
  1. 29
      Cargo.lock
  2. 2
      Cargo.toml
  3. 36
      src/database/abstraction/persy.rs
  4. 14
      src/error.rs

29
Cargo.lock generated

@ -170,12 +170,6 @@ dependencies = [
"generic-array", "generic-array",
] ]
[[package]]
name = "build_const"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b4ae4235e6dac0694637c763029ecea1a2ec9e4e06ec2729bd21ba4d9c863eb7"
[[package]] [[package]]
name = "bumpalo" name = "bumpalo"
version = "3.7.0" version = "3.7.0"
@ -342,13 +336,19 @@ dependencies = [
[[package]] [[package]]
name = "crc" name = "crc"
version = "1.8.1" version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb" checksum = "10c2722795460108a7872e1cd933a85d6ec38abc4baecad51028f702da28889f"
dependencies = [ 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]] [[package]]
name = "crc32fast" name = "crc32fast"
version = "1.2.1" version = "1.2.1"
@ -1644,16 +1644,17 @@ checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e"
[[package]] [[package]]
name = "persy" name = "persy"
version = "0.11.13" version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2cc96c7b02a7abb1df713f326c4deb493ce2b72155935d3e6ed0ba24bd9e778d" checksum = "de4cd9bda96e9bab3c961620ca512def7a7a880152780132632506abe4414458"
dependencies = [ dependencies = [
"byteorder", "byteorder",
"crc", "crc",
"data-encoding", "data-encoding",
"fs2", "fs2",
"linked-hash-map", "linked-hash-map",
"rand 0.7.3", "rand 0.8.4",
"thiserror",
"unsigned-varint", "unsigned-varint",
"zigzag", "zigzag",
] ]
@ -3279,9 +3280,9 @@ checksum = "f14ee04d9415b52b3aeab06258a3f07093182b88ba0f9b8d203f211a7a7d41c7"
[[package]] [[package]]
name = "unsigned-varint" name = "unsigned-varint"
version = "0.5.1" version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f7fdeedbf205afadfe39ae559b75c3240f24e257d0ca27e85f85cb82aa19ac35" checksum = "5f8d425fafb8cd76bc3f22aace4af471d3156301d7508f2107e98fbeae10bc7f"
[[package]] [[package]]
name = "untrusted" name = "untrusted"

2
Cargo.toml

@ -28,7 +28,7 @@ tokio = "1.8.2"
# Used for storing data permanently # Used for storing data permanently
sled = { version = "0.34.6", features = ["compression", "no_metrics"], optional = true } sled = { version = "0.34.6", features = ["compression", "no_metrics"], optional = true }
#sled = { git = "https://github.com/spacejam/sled.git", rev = "e4640e0773595229f398438886f19bca6f7326a2", features = ["compression"] } #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 # Used by the persy write cache for background flush
timer = "0.2" timer = "0.2"
chrono = "0.4" chrono = "0.4"

36
src/database/abstraction/persy.rs

@ -56,7 +56,7 @@ impl DatabaseEngine for PersyEngine {
// Create if it doesn't exist // Create if it doesn't exist
if !self.persy.exists_index(name)? { if !self.persy.exists_index(name)? {
let mut tx = self.persy.begin()?; let mut tx = self.persy.begin()?;
tx.create_index::<ByteVec, ByteVec>(name, ValueMode::REPLACE)?; tx.create_index::<ByteVec, ByteVec>(name, ValueMode::Replace)?;
tx.prepare()?.commit()?; tx.prepare()?.commit()?;
} }
@ -187,15 +187,15 @@ impl WriteCache {
for (key, value) in changes { for (key, value) in changes {
tx.put::<ByteVec, ByteVec>( tx.put::<ByteVec, ByteVec>(
&index, &index,
ByteVec(key.to_owned()), ByteVec::new(key.to_owned()),
ByteVec(value.to_owned()), ByteVec::new(value.to_owned()),
)?; )?;
} }
} }
self.add_cache.clear(); self.add_cache.clear();
for (index, changes) in &self.remove_cache { for (index, changes) in &self.remove_cache {
for key in changes { for key in changes {
tx.remove::<ByteVec, ByteVec>(&index, ByteVec(key.to_owned()), None)?; tx.remove::<ByteVec, ByteVec>(&index, ByteVec::new(key.to_owned()), None)?;
} }
} }
self.remove_cache.clear(); self.remove_cache.clear();
@ -356,9 +356,9 @@ impl Tree for PersyTree {
fn get(&self, key: &[u8]) -> Result<Option<Vec<u8>>> { fn get(&self, key: &[u8]) -> Result<Option<Vec<u8>>> {
let result = self let result = self
.persy .persy
.get::<ByteVec, ByteVec>(&self.name, &ByteVec(key.to_vec()))? .get::<ByteVec, ByteVec>(&self.name, &ByteVec::new(key.to_vec()))?
.map(|v| v.into_iter().map(|bv| bv.0).next()) .next()
.flatten(); .map(|v| (*v).to_owned());
let result = self let result = self
.write_cache .write_cache
.read() .read()
@ -396,7 +396,6 @@ impl Tree for PersyTree {
Ok(()) Ok(())
} }
#[tracing::instrument(skip(self, iter))]
fn insert_batch<'a>(&self, iter: &mut dyn Iterator<Item = (Vec<u8>, Vec<u8>)>) -> Result<()> { fn insert_batch<'a>(&self, iter: &mut dyn Iterator<Item = (Vec<u8>, Vec<u8>)>) -> Result<()> {
//TODO: evaluate if use instead a single big transaction //TODO: evaluate if use instead a single big transaction
for (key, value) in iter { for (key, value) in iter {
@ -406,6 +405,13 @@ impl Tree for PersyTree {
Ok(()) Ok(())
} }
fn increment_batch<'a>(&self, iter: &mut dyn Iterator<Item = Vec<u8>>) -> Result<()> {
for key in iter {
self.increment(&key)?;
}
Ok(())
}
fn remove(&self, key: &[u8]) -> Result<()> { fn remove(&self, key: &[u8]) -> Result<()> {
self.write_cache self.write_cache
.write() .write()
@ -420,7 +426,7 @@ impl Tree for PersyTree {
Ok(iter) => { Ok(iter) => {
let result = Box::new(iter.filter_map(|(k, v)| { let result = Box::new(iter.filter_map(|(k, v)| {
v.into_iter() 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() .next()
})); }));
@ -440,16 +446,16 @@ impl Tree for PersyTree {
) -> Box<dyn Iterator<Item = (Vec<u8>, Vec<u8>)> + 'a> { ) -> Box<dyn Iterator<Item = (Vec<u8>, Vec<u8>)> + 'a> {
let range = if backwards { let range = if backwards {
self.persy self.persy
.range::<ByteVec, ByteVec, _>(&self.name, ..ByteVec(from.to_owned())) .range::<ByteVec, ByteVec, _>(&self.name, ..ByteVec::new(from.to_owned()))
} else { } else {
self.persy self.persy
.range::<ByteVec, ByteVec, _>(&self.name, ByteVec(from.to_owned())..) .range::<ByteVec, ByteVec, _>(&self.name, ByteVec::new(from.to_owned())..)
}; };
match range { match range {
Ok(iter) => { Ok(iter) => {
let map = iter.filter_map(|(k, v)| { let map = iter.filter_map(|(k, v)| {
v.into_iter() 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() .next()
}); });
let result: Box<dyn Iterator<Item = (Vec<u8>, Vec<u8>)> + Send + 'a> = if backwards let result: Box<dyn Iterator<Item = (Vec<u8>, Vec<u8>)> + Send + 'a> = if backwards
@ -482,7 +488,7 @@ impl Tree for PersyTree {
&'a self, &'a self,
prefix: Vec<u8>, prefix: Vec<u8>,
) -> Box<dyn Iterator<Item = (Vec<u8>, Vec<u8>)> + 'a> { ) -> Box<dyn Iterator<Item = (Vec<u8>, Vec<u8>)> + 'a> {
let range_prefix = ByteVec(prefix.to_owned()); let range_prefix = ByteVec::new(prefix.to_owned());
let range = self let range = self
.persy .persy
.range::<ByteVec, ByteVec, _>(&self.name, range_prefix..); .range::<ByteVec, ByteVec, _>(&self.name, range_prefix..);
@ -491,10 +497,10 @@ impl Tree for PersyTree {
Ok(iter) => { Ok(iter) => {
let owned_prefix = prefix.clone(); let owned_prefix = prefix.clone();
let result = Box::new( 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)| { .filter_map(|(k, v)| {
v.into_iter() 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() .next()
}), }),
); );

14
src/error.rs

@ -1,3 +1,4 @@
use persy::PersyError;
use ruma::{ use ruma::{
api::client::{ api::client::{
error::{Error as RumaError, ErrorKind}, error::{Error as RumaError, ErrorKind},
@ -38,10 +39,7 @@ pub enum Error {
}, },
#[cfg(feature = "persy")] #[cfg(feature = "persy")]
#[error("There was a problem with the connection to the persy database.")] #[error("There was a problem with the connection to the persy database.")]
PersyError { PersyError { source: persy::PersyError },
#[from]
source: persy::PersyError,
},
#[cfg(feature = "heed")] #[cfg(feature = "heed")]
#[error("There was a problem with the connection to the heed database: {error}")] #[error("There was a problem with the connection to the heed database: {error}")]
HeedError { error: String }, HeedError { error: String },
@ -142,3 +140,11 @@ where
self.to_response().respond_to(r) self.to_response().respond_to(r)
} }
} }
impl<T: Into<PersyError>> From<persy::PE<T>> for Error {
fn from(err: persy::PE<T>) -> Self {
Error::PersyError {
source: err.error().into(),
}
}
}

Loading…
Cancel
Save