From 116bdbe459f3eaabd14fe0611527379689385d6f Mon Sep 17 00:00:00 2001 From: librelois <c@elo.tf> Date: Fri, 14 May 2021 19:37:01 +0200 Subject: [PATCH] perf(dbs): serialize integers as varint --- Cargo.lock | 10 ++++++++-- bc-reader/Cargo.toml | 2 +- dbs/Cargo.toml | 4 ++-- dbs/src/keys/blockstamp.rs | 2 +- dbs/src/keys/pubkey_and_sig.rs | 2 +- dbs/src/keys/source_key.rs | 2 +- dbs/src/keys/uid.rs | 8 +++----- dbs/src/keys/wallet_conditions.rs | 12 +++++++----- dbs/src/lib.rs | 6 ++++++ dbs/src/values/block_db.rs | 8 ++++++-- dbs/src/values/block_meta.rs | 14 ++++++++------ dbs/src/values/dunp_head.rs | 8 ++++++-- dbs/src/values/idty_db.rs | 6 ++++-- dbs/src/values/peer_card.rs | 8 ++++++-- dbs/src/values/tx_db.rs | 8 ++++++-- dbs/src/values/txs.rs | 8 ++++++-- dbs/src/values/utxo.rs | 6 ++++-- dbs/src/values/wallet_script_with_sa.rs | 6 ++++-- tools/kv_typed/Cargo.toml | 4 ++-- 19 files changed, 82 insertions(+), 42 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2af0f7e..7eb46ff 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -27,6 +27,12 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" +[[package]] +name = "arrayvec" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a2f58b0bb10c380af2b26e57212856b8c9a59e0925b4c20f4a174a49734eaf7" + [[package]] name = "async-attributes" version = "1.1.2" @@ -243,7 +249,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e9ff35b701f3914bdb8fad3368d822c766ef2858b2583198e41639b936f09d3f" dependencies = [ "arrayref", - "arrayvec", + "arrayvec 0.5.2", "cc", "cfg-if 0.1.10", "constant_time_eq", @@ -812,7 +818,7 @@ name = "duniter-dbs" version = "0.1.0" dependencies = [ "anyhow", - "arrayvec", + "arrayvec 0.7.0", "bincode", "byteorder", "chrono", diff --git a/bc-reader/Cargo.toml b/bc-reader/Cargo.toml index d2e0957..bc421b9 100644 --- a/bc-reader/Cargo.toml +++ b/bc-reader/Cargo.toml @@ -18,4 +18,4 @@ dubp = { version = "0.53.1", features = ["duniter"] } resiter = "0.4.0" [dev-dependencies] -smallvec = { version = "1.4.0", features = ["serde", "write"] } +smallvec = { version = "1.6", features = ["serde", "write"] } diff --git a/dbs/Cargo.toml b/dbs/Cargo.toml index 6dfe970..332848d 100644 --- a/dbs/Cargo.toml +++ b/dbs/Cargo.toml @@ -12,7 +12,7 @@ edition = "2018" path = "src/lib.rs" [dependencies] -arrayvec = "0.5.1" +arrayvec = "0.7" bincode = "1.2.1" byteorder = "1.3.4" chrono = { version = "0.4.15", optional = true } @@ -25,7 +25,7 @@ paste = "1.0.2" rand = "0.8.3" serde = { version = "1.0.105", features = ["derive"] } serde_json = "1.0.53" -smallvec = { version = "1.4.0", features = ["serde", "write"] } +smallvec = { version = "1.6", features = ["serde", "write"] } thiserror = "1.0.20" uninit = "0.4.0" zerocopy = "0.3.0" diff --git a/dbs/src/keys/blockstamp.rs b/dbs/src/keys/blockstamp.rs index 6b4a8df..aa2e23c 100644 --- a/dbs/src/keys/blockstamp.rs +++ b/dbs/src/keys/blockstamp.rs @@ -28,7 +28,7 @@ impl kv_typed::prelude::FromBytes for BlockstampKeyV1 { type Err = CorruptedBytes; fn from_bytes(bytes: &[u8]) -> std::result::Result<Self, Self::Err> { - let blockstamp_strs: ArrayVec<[&str; 2]> = std::str::from_utf8(bytes) + let blockstamp_strs: ArrayVec<&str, 2> = std::str::from_utf8(bytes) .map_err(|e| CorruptedBytes(e.to_string()))? .split('-') .collect(); diff --git a/dbs/src/keys/pubkey_and_sig.rs b/dbs/src/keys/pubkey_and_sig.rs index 47a14c9..9c6a010 100644 --- a/dbs/src/keys/pubkey_and_sig.rs +++ b/dbs/src/keys/pubkey_and_sig.rs @@ -42,7 +42,7 @@ impl kv_typed::prelude::FromBytes for PubKeyAndSigV1 { if raw_str == "ALL" { Ok(PubKeyAndSigV1::all()) } else { - let array_str: ArrayVec<[&str; 2]> = raw_str.split(':').collect(); + let array_str: ArrayVec<&str, 2> = raw_str.split(':').collect(); let pubkey = PublicKey::from_base58(array_str[0]).map_err(|e| CorruptedBytes(e.to_string()))?; let sig = diff --git a/dbs/src/keys/source_key.rs b/dbs/src/keys/source_key.rs index accb5c9..fbdb1d6 100644 --- a/dbs/src/keys/source_key.rs +++ b/dbs/src/keys/source_key.rs @@ -47,7 +47,7 @@ impl kv_typed::prelude::FromBytes for SourceKeyV1 { type Err = CorruptedBytes; fn from_bytes(bytes: &[u8]) -> std::result::Result<Self, Self::Err> { - let strs: ArrayVec<[&str; 3]> = std::str::from_utf8(bytes) + let strs: ArrayVec<&str, 3> = std::str::from_utf8(bytes) .map_err(|e| CorruptedBytes(e.to_string()))? .split('-') .collect(); diff --git a/dbs/src/keys/uid.rs b/dbs/src/keys/uid.rs index a5e4bd7..968d7e8 100644 --- a/dbs/src/keys/uid.rs +++ b/dbs/src/keys/uid.rs @@ -18,7 +18,7 @@ use crate::*; const USERNAME_MAX_LEN: usize = 100; #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, PartialOrd)] -pub struct UidKeyV1(pub ArrayString<[u8; USERNAME_MAX_LEN]>); +pub struct UidKeyV1(pub ArrayString<USERNAME_MAX_LEN>); impl AsBytes for UidKeyV1 { fn as_bytes<T, F: FnMut(&[u8]) -> T>(&self, mut f: F) -> T { @@ -32,7 +32,7 @@ impl kv_typed::prelude::FromBytes for UidKeyV1 { fn from_bytes(bytes: &[u8]) -> std::result::Result<Self, Self::Err> { let uid_str = std::str::from_utf8(bytes).map_err(|e| CorruptedBytes(e.to_string()))?; Ok(Self( - ArrayString::<[u8; USERNAME_MAX_LEN]>::from_str(uid_str) + ArrayString::<USERNAME_MAX_LEN>::from_str(uid_str) .map_err(|e| CorruptedBytes(e.to_string()))?, )) } @@ -42,9 +42,7 @@ impl FromStr for UidKeyV1 { type Err = arrayvec::CapacityError; fn from_str(source: &str) -> std::result::Result<Self, Self::Err> { - Ok(UidKeyV1(ArrayString::<[u8; USERNAME_MAX_LEN]>::from_str( - source, - )?)) + Ok(UidKeyV1(ArrayString::<USERNAME_MAX_LEN>::from_str(source)?)) } } diff --git a/dbs/src/keys/wallet_conditions.rs b/dbs/src/keys/wallet_conditions.rs index 56af52a..d7a8cb7 100644 --- a/dbs/src/keys/wallet_conditions.rs +++ b/dbs/src/keys/wallet_conditions.rs @@ -18,7 +18,7 @@ use crate::*; const CONDITIONS_MAX_LEN: usize = 256; #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, PartialOrd)] -pub struct WalletConditionsV1(pub ArrayString<[u8; CONDITIONS_MAX_LEN]>); +pub struct WalletConditionsV1(pub ArrayString<CONDITIONS_MAX_LEN>); impl AsBytes for WalletConditionsV1 { fn as_bytes<T, F: FnMut(&[u8]) -> T>(&self, mut f: F) -> T { @@ -32,7 +32,7 @@ impl kv_typed::prelude::FromBytes for WalletConditionsV1 { fn from_bytes(bytes: &[u8]) -> std::result::Result<Self, Self::Err> { let uid_str = std::str::from_utf8(bytes).map_err(|e| CorruptedBytes(e.to_string()))?; Ok(Self( - ArrayString::<[u8; CONDITIONS_MAX_LEN]>::from_str(uid_str) + ArrayString::<CONDITIONS_MAX_LEN>::from_str(uid_str) .map_err(|e| CorruptedBytes(e.to_string()))?, )) } @@ -43,7 +43,7 @@ impl FromStr for WalletConditionsV1 { fn from_str(source: &str) -> std::result::Result<Self, Self::Err> { Ok(WalletConditionsV1( - ArrayString::<[u8; CONDITIONS_MAX_LEN]>::from_str(source)?, + ArrayString::<CONDITIONS_MAX_LEN>::from_str(source)?, )) } } @@ -79,7 +79,9 @@ impl WalletConditionsV2 { impl AsBytes for WalletConditionsV2 { fn as_bytes<T, F: FnMut(&[u8]) -> T>(&self, mut f: F) -> T { let mut buffer = SmallVec::<[u8; 256]>::new(); - bincode::serialize_into(&mut buffer, &self.0).unwrap_or_else(|_| unreachable!()); + bincode_db() + .serialize_into(&mut buffer, &self.0) + .unwrap_or_else(|_| unreachable!()); f(buffer.as_ref()) } } @@ -88,7 +90,7 @@ impl kv_typed::prelude::FromBytes for WalletConditionsV2 { type Err = bincode::Error; fn from_bytes(bytes: &[u8]) -> std::result::Result<Self, Self::Err> { - Ok(Self(bincode::deserialize(bytes)?)) + Ok(Self(bincode_db().deserialize(bytes)?)) } } diff --git a/dbs/src/lib.rs b/dbs/src/lib.rs index 63d8a82..863221c 100644 --- a/dbs/src/lib.rs +++ b/dbs/src/lib.rs @@ -89,6 +89,7 @@ pub use values::wallet_script_with_sa::WalletScriptWithSourceAmountV1Db; // Crate imports pub(crate) use arrayvec::{ArrayString, ArrayVec}; +pub(crate) use bincode::Options; #[cfg(feature = "explorer")] use chrono::NaiveDateTime; pub(crate) use dubp::common::crypto::bases::b58::ToBase58 as _; @@ -142,3 +143,8 @@ impl SharedDbs<Mem> { }) } } + +// Bincode db configuration +pub fn bincode_db() -> impl bincode::Options { + bincode::options() +} diff --git a/dbs/src/values/block_db.rs b/dbs/src/values/block_db.rs index c288cda..2c6c508 100644 --- a/dbs/src/values/block_db.rs +++ b/dbs/src/values/block_db.rs @@ -122,7 +122,9 @@ pub struct BlockDbV2(pub dubp::block::DubpBlockV10); impl AsBytes for BlockDbV2 { fn as_bytes<T, F: FnMut(&[u8]) -> T>(&self, mut f: F) -> T { - let bytes = bincode::serialize(self).unwrap_or_else(|_| unreachable!()); + let bytes = bincode_db() + .serialize(self) + .unwrap_or_else(|_| unreachable!()); f(bytes.as_ref()) } } @@ -131,7 +133,9 @@ impl kv_typed::prelude::FromBytes for BlockDbV2 { type Err = CorruptedBytes; fn from_bytes(bytes: &[u8]) -> std::result::Result<Self, Self::Err> { - bincode::deserialize(&bytes).map_err(|e| CorruptedBytes(format!("{}: '{:?}'", e, bytes))) + bincode_db() + .deserialize(&bytes) + .map_err(|e| CorruptedBytes(format!("{}: '{:?}'", e, bytes))) } } diff --git a/dbs/src/values/block_meta.rs b/dbs/src/values/block_meta.rs index 949a644..92eaee0 100644 --- a/dbs/src/values/block_meta.rs +++ b/dbs/src/values/block_meta.rs @@ -17,7 +17,7 @@ use dubp::block::DubpBlockV10; use crate::*; -const BLOCK_META_SERIALIZED_SIZE: usize = 323; +const BLOCK_META_MAX_SERIALIZED_SIZE: usize = 323; #[derive(Clone, Copy, Debug, Default, Deserialize, PartialEq, Serialize)] pub struct BlockMetaV2 { @@ -52,8 +52,10 @@ impl BlockMetaV2 { impl AsBytes for BlockMetaV2 { fn as_bytes<T, F: FnMut(&[u8]) -> T>(&self, mut f: F) -> T { - let mut buffer = [0u8; BLOCK_META_SERIALIZED_SIZE]; - bincode::serialize_into(&mut buffer[..], self).unwrap_or_else(|_| unreachable!()); + let mut buffer = ArrayVec::<u8, BLOCK_META_MAX_SERIALIZED_SIZE>::new(); + bincode_db() + .serialize_into(&mut buffer, self) + .unwrap_or_else(|_| unreachable!()); f(buffer.as_ref()) } } @@ -62,7 +64,7 @@ impl kv_typed::prelude::FromBytes for BlockMetaV2 { type Err = bincode::Error; fn from_bytes(bytes: &[u8]) -> std::result::Result<Self, Self::Err> { - bincode::deserialize(bytes) + bincode_db().deserialize(bytes) } } @@ -91,11 +93,11 @@ mod tests { #[test] fn block_meta_v2_as_bytes() { assert_eq!( - unwrap!(bincode::serialized_size(&BlockMetaV2 { + unwrap!(bincode_db().serialized_size(&BlockMetaV2 { dividend: Some(SourceAmount::new(42, 0)), ..Default::default() })), - BLOCK_META_SERIALIZED_SIZE as u64 + 255 ); let bloc_meta = BlockMetaV2::default(); diff --git a/dbs/src/values/dunp_head.rs b/dbs/src/values/dunp_head.rs index bf42b21..a9b1515 100644 --- a/dbs/src/values/dunp_head.rs +++ b/dbs/src/values/dunp_head.rs @@ -94,7 +94,9 @@ mod tests { impl AsBytes for DunpHeadDbV1 { fn as_bytes<T, F: FnMut(&[u8]) -> T>(&self, mut f: F) -> T { - let bytes = bincode::serialize(self).unwrap_or_else(|_| unreachable!()); + let bytes = bincode_db() + .serialize(self) + .unwrap_or_else(|_| unreachable!()); f(bytes.as_ref()) } } @@ -103,7 +105,9 @@ impl kv_typed::prelude::FromBytes for DunpHeadDbV1 { type Err = CorruptedBytes; fn from_bytes(bytes: &[u8]) -> std::result::Result<Self, Self::Err> { - bincode::deserialize(&bytes).map_err(|e| CorruptedBytes(format!("{}: '{:?}'", e, bytes))) + bincode_db() + .deserialize(&bytes) + .map_err(|e| CorruptedBytes(format!("{}: '{:?}'", e, bytes))) } } diff --git a/dbs/src/values/idty_db.rs b/dbs/src/values/idty_db.rs index 504f799..688e1f9 100644 --- a/dbs/src/values/idty_db.rs +++ b/dbs/src/values/idty_db.rs @@ -23,7 +23,9 @@ pub struct IdtyDbV2 { impl AsBytes for IdtyDbV2 { fn as_bytes<T, F: FnMut(&[u8]) -> T>(&self, mut f: F) -> T { - f(&bincode::serialize(&self).unwrap_or_else(|_| unreachable!())) + f(&bincode_db() + .serialize(&self) + .unwrap_or_else(|_| unreachable!())) } } @@ -31,7 +33,7 @@ impl kv_typed::prelude::FromBytes for IdtyDbV2 { type Err = bincode::Error; fn from_bytes(bytes: &[u8]) -> std::result::Result<Self, Self::Err> { - bincode::deserialize(bytes) + bincode_db().deserialize(bytes) } } diff --git a/dbs/src/values/peer_card.rs b/dbs/src/values/peer_card.rs index 15dfaec..39979f5 100644 --- a/dbs/src/values/peer_card.rs +++ b/dbs/src/values/peer_card.rs @@ -53,7 +53,9 @@ impl PeerCardDbV1 { impl AsBytes for PeerCardDbV1 { fn as_bytes<T, F: FnMut(&[u8]) -> T>(&self, mut f: F) -> T { - let bytes = bincode::serialize(self).unwrap_or_else(|_| unreachable!()); + let bytes = bincode_db() + .serialize(self) + .unwrap_or_else(|_| unreachable!()); f(bytes.as_ref()) } } @@ -62,7 +64,9 @@ impl kv_typed::prelude::FromBytes for PeerCardDbV1 { type Err = CorruptedBytes; fn from_bytes(bytes: &[u8]) -> std::result::Result<Self, Self::Err> { - bincode::deserialize(&bytes).map_err(|e| CorruptedBytes(format!("{}: '{:?}'", e, bytes))) + bincode_db() + .deserialize(&bytes) + .map_err(|e| CorruptedBytes(format!("{}: '{:?}'", e, bytes))) } } diff --git a/dbs/src/values/tx_db.rs b/dbs/src/values/tx_db.rs index 59700b7..beae057 100644 --- a/dbs/src/values/tx_db.rs +++ b/dbs/src/values/tx_db.rs @@ -24,7 +24,9 @@ pub struct PendingTxDbV2 { impl AsBytes for PendingTxDbV2 { fn as_bytes<T, F: FnMut(&[u8]) -> T>(&self, mut f: F) -> T { - let bytes = bincode::serialize(self).unwrap_or_else(|_| unreachable!()); + let bytes = bincode_db() + .serialize(self) + .unwrap_or_else(|_| unreachable!()); f(bytes.as_ref()) } } @@ -33,7 +35,9 @@ impl kv_typed::prelude::FromBytes for PendingTxDbV2 { type Err = CorruptedBytes; fn from_bytes(bytes: &[u8]) -> std::result::Result<Self, Self::Err> { - bincode::deserialize(&bytes).map_err(|e| CorruptedBytes(format!("{}: '{:?}'", e, bytes))) + bincode_db() + .deserialize(&bytes) + .map_err(|e| CorruptedBytes(format!("{}: '{:?}'", e, bytes))) } } diff --git a/dbs/src/values/txs.rs b/dbs/src/values/txs.rs index f150673..530506e 100644 --- a/dbs/src/values/txs.rs +++ b/dbs/src/values/txs.rs @@ -21,7 +21,9 @@ pub struct BlockTxsDbV2(pub SmallVec<[TransactionDocumentV10; 8]>); impl AsBytes for BlockTxsDbV2 { fn as_bytes<T, F: FnMut(&[u8]) -> T>(&self, mut f: F) -> T { - let bytes = bincode::serialize(self).unwrap_or_else(|_| unreachable!()); + let bytes = bincode_db() + .serialize(self) + .unwrap_or_else(|_| unreachable!()); f(bytes.as_ref()) } } @@ -30,7 +32,9 @@ impl kv_typed::prelude::FromBytes for BlockTxsDbV2 { type Err = CorruptedBytes; fn from_bytes(bytes: &[u8]) -> std::result::Result<Self, Self::Err> { - bincode::deserialize(&bytes).map_err(|e| CorruptedBytes(format!("{}: '{:?}'", e, bytes))) + bincode_db() + .deserialize(&bytes) + .map_err(|e| CorruptedBytes(format!("{}: '{:?}'", e, bytes))) } } diff --git a/dbs/src/values/utxo.rs b/dbs/src/values/utxo.rs index dc5b60e..2c8bb4b 100644 --- a/dbs/src/values/utxo.rs +++ b/dbs/src/values/utxo.rs @@ -113,7 +113,9 @@ pub struct BlockUtxosV2Db(pub HashMap<UtxoIdV10, WalletScriptWithSourceAmountV1D impl AsBytes for BlockUtxosV2Db { fn as_bytes<T, F: FnMut(&[u8]) -> T>(&self, mut f: F) -> T { - f(&bincode::serialize(&self).unwrap_or_else(|_| unreachable!())) + f(&bincode_db() + .serialize(&self) + .unwrap_or_else(|_| unreachable!())) } } @@ -121,7 +123,7 @@ impl kv_typed::prelude::FromBytes for BlockUtxosV2Db { type Err = bincode::Error; fn from_bytes(bytes: &[u8]) -> std::result::Result<Self, Self::Err> { - bincode::deserialize(bytes) + bincode_db().deserialize(bytes) } } diff --git a/dbs/src/values/wallet_script_with_sa.rs b/dbs/src/values/wallet_script_with_sa.rs index 5d40dd9..251a964 100644 --- a/dbs/src/values/wallet_script_with_sa.rs +++ b/dbs/src/values/wallet_script_with_sa.rs @@ -23,7 +23,9 @@ pub struct WalletScriptWithSourceAmountV1Db { impl AsBytes for WalletScriptWithSourceAmountV1Db { fn as_bytes<T, F: FnMut(&[u8]) -> T>(&self, mut f: F) -> T { - f(&bincode::serialize(&self).unwrap_or_else(|_| unreachable!())) + f(&bincode_db() + .serialize(&self) + .unwrap_or_else(|_| unreachable!())) } } @@ -31,7 +33,7 @@ impl kv_typed::prelude::FromBytes for WalletScriptWithSourceAmountV1Db { type Err = bincode::Error; fn from_bytes(bytes: &[u8]) -> std::result::Result<Self, Self::Err> { - bincode::deserialize(bytes) + bincode_db().deserialize(bytes) } } diff --git a/tools/kv_typed/Cargo.toml b/tools/kv_typed/Cargo.toml index 8dc44bb..0b8a4a1 100644 --- a/tools/kv_typed/Cargo.toml +++ b/tools/kv_typed/Cargo.toml @@ -23,7 +23,7 @@ rayon = { version = "1.3.1", optional = true } regex = { version = "1.3.9", optional = true } serde_json = { version = "1.0.53", optional = true } sled = { version = "0.34.6", optional = true } -smallvec = { version = "1.4.0", features = ["serde", "write"] } +smallvec = { version = "1.6", features = ["serde", "write"] } thiserror = "1.0.20" uninit = "0.4.0" zerocopy = "0.3.0" @@ -36,7 +36,7 @@ required-features = ["leveldb_backend", "sled_backend"] [dev-dependencies] async-std = { version = "1.6.3", features = ["attributes"] } maybe-async = "0.2.0" -smallvec = { version = "1.4.0", features = ["serde", "write"] } +smallvec = { version = "1.6", features = ["serde", "write"] } tempfile = "3.2.0" unwrap = "1.2.1" -- GitLab