From f6b25ce48ca3707a88d22c5ec0d349c37e274ebd Mon Sep 17 00:00:00 2001 From: Sayan Nandan Date: Fri, 27 Nov 2020 10:43:41 +0530 Subject: [PATCH] Don't clone when writing data to disk Previously we were cloning data before writing to disk which caused slowdowns and lead to higher memory usage. This is an attempt to fix this behavior. Signed-off-by: Sayan Nandan --- server/src/coredb/mod.rs | 4 ++++ server/src/diskstore/mod.rs | 14 +++++++++----- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/server/src/coredb/mod.rs b/server/src/coredb/mod.rs index 71f7a7f7..42b50e95 100644 --- a/server/src/coredb/mod.rs +++ b/server/src/coredb/mod.rs @@ -201,6 +201,10 @@ impl Data { pub const fn get_blob(&self) -> &Bytes { &self.blob } + /// Get the inner blob as an `u8` slice (coerced) + pub fn get_inner_ref(&self) -> &[u8] { + &self.blob + } } impl CoreDB { diff --git a/server/src/diskstore/mod.rs b/server/src/diskstore/mod.rs index b23b8dfb..c1d1eea0 100644 --- a/server/src/diskstore/mod.rs +++ b/server/src/diskstore/mod.rs @@ -35,7 +35,11 @@ use std::time::Duration; use tokio::time; pub mod snapshot; -type DiskStore = (Vec, Vec>); +/// This type alias is to be used when deserializing binary data from disk +type DiskStoreFromDisk = (Vec, Vec>); +/// This type alias is to be used when serializing data from the in-memory table +/// onto disk +type DiskStoreFromMemory<'a> = (Vec<&'a String>, Vec<&'a [u8]>); lazy_static::lazy_static! { pub static ref PERSIST_FILE: PathBuf = PathBuf::from("./data.bin"); } @@ -58,7 +62,7 @@ pub fn get_saved(location: Option) -> TResult return Err(format!("Couldn't read flushed data from disk: {}", e).into()), }, }; - let parsed: DiskStore = bincode::deserialize(&file)?; + let parsed: DiskStoreFromDisk = bincode::deserialize(&file)?; let parsed: HashMap = HashMap::from_iter( parsed .0 @@ -77,9 +81,9 @@ pub fn get_saved(location: Option) -> TResult) -> TResult<()> { - let ds: DiskStore = ( - data.keys().into_iter().map(|val| val.to_string()).collect(), - data.values().map(|val| val.get_blob().to_vec()).collect(), + let ds: DiskStoreFromMemory = ( + data.keys().into_iter().collect(), + data.values().map(|val| val.get_inner_ref()).collect(), ); let encoded = bincode::serialize(&ds)?; let mut file = fs::File::create(filename)?;