From edfccea30a6766da1322a7dac1415a9970f47b88 Mon Sep 17 00:00:00 2001 From: Lambda Date: Mon, 20 May 2024 10:13:01 +0000 Subject: [PATCH] Convert giant tuple in state_compressor to struct --- src/database.rs | 4 +- .../key_value/rooms/state_accessor.rs | 6 +- src/service/rooms/state.rs | 8 +- src/service/rooms/state_compressor.rs | 82 +++++++------------ 4 files changed, 39 insertions(+), 61 deletions(-) diff --git a/src/database.rs b/src/database.rs index d32b57f5..9a31cf74 100644 --- a/src/database.rs +++ b/src/database.rs @@ -722,12 +722,12 @@ impl KeyValueDatabase { states_parents.last() { let statediffnew = current_state - .difference(&parent_stateinfo.1) + .difference(&parent_stateinfo.full_state) .copied() .collect::>(); let statediffremoved = parent_stateinfo - .1 + .full_state .difference(¤t_state) .copied() .collect::>(); diff --git a/src/database/key_value/rooms/state_accessor.rs b/src/database/key_value/rooms/state_accessor.rs index ed763bf3..39b7d1d6 100644 --- a/src/database/key_value/rooms/state_accessor.rs +++ b/src/database/key_value/rooms/state_accessor.rs @@ -20,7 +20,7 @@ impl service::rooms::state_accessor::Data for KeyValueDatabase { .load_shortstatehash_info(shortstatehash)? .pop() .expect("there is always one layer") - .1; + .full_state; let mut result = HashMap::new(); let mut i = 0; for compressed in full_state.iter() { @@ -48,7 +48,7 @@ impl service::rooms::state_accessor::Data for KeyValueDatabase { .load_shortstatehash_info(shortstatehash)? .pop() .expect("there is always one layer") - .1; + .full_state; let mut result = HashMap::new(); let mut i = 0; @@ -102,7 +102,7 @@ impl service::rooms::state_accessor::Data for KeyValueDatabase { .load_shortstatehash_info(shortstatehash)? .pop() .expect("there is always one layer") - .1; + .full_state; Ok(full_state .iter() .find(|bytes| bytes.starts_with(&shortstatekey.to_be_bytes())) diff --git a/src/service/rooms/state.rs b/src/service/rooms/state.rs index a62f2394..32037633 100644 --- a/src/service/rooms/state.rs +++ b/src/service/rooms/state.rs @@ -159,12 +159,12 @@ impl Service { let (statediffnew, statediffremoved) = if let Some(parent_stateinfo) = states_parents.last() { let statediffnew: HashSet<_> = state_ids_compressed - .difference(&parent_stateinfo.1) + .difference(&parent_stateinfo.full_state) .copied() .collect(); let statediffremoved: HashSet<_> = parent_stateinfo - .1 + .full_state .difference(&state_ids_compressed) .copied() .collect(); @@ -231,7 +231,7 @@ impl Service { let replaces = states_parents .last() .map(|info| { - info.1.iter().find(|bytes| { + info.full_state.iter().find(|bytes| { bytes.starts_with(&shortstatekey.to_be_bytes()) }) }) @@ -436,7 +436,7 @@ impl Service { .load_shortstatehash_info(shortstatehash)? .pop() .expect("there is always one layer") - .1; + .full_state; Ok(full_state .iter() diff --git a/src/service/rooms/state_compressor.rs b/src/service/rooms/state_compressor.rs index 538c75f1..e9ed9c00 100644 --- a/src/service/rooms/state_compressor.rs +++ b/src/service/rooms/state_compressor.rs @@ -12,25 +12,19 @@ use ruma::{EventId, RoomId}; use self::data::StateDiff; use crate::{services, utils, Result}; +#[derive(Clone)] +pub(crate) struct CompressedStateLayer { + pub(crate) shortstatehash: u64, + pub(crate) full_state: Arc>, + pub(crate) added: Arc>, + pub(crate) removed: Arc>, +} + pub(crate) struct Service { pub(crate) db: &'static dyn Data, #[allow(clippy::type_complexity)] - pub(crate) stateinfo_cache: Mutex< - LruCache< - u64, - Vec<( - // shortstatehash - u64, - // full state - Arc>, - // added - Arc>, - // removed - Arc>, - )>, - >, - >, + pub(crate) stateinfo_cache: Mutex>>, } pub(crate) type CompressedStateEvent = [u8; 2 * size_of::()]; @@ -43,18 +37,7 @@ impl Service { pub(crate) fn load_shortstatehash_info( &self, shortstatehash: u64, - ) -> Result< - Vec<( - // shortstatehash - u64, - // full state - Arc>, - // added - Arc>, - // removed - Arc>, - )>, - > { + ) -> Result> { if let Some(r) = self.stateinfo_cache.lock().unwrap().get_mut(&shortstatehash) { @@ -69,19 +52,19 @@ impl Service { if let Some(parent) = parent { let mut response = self.load_shortstatehash_info(parent)?; - let mut state = (*response.last().unwrap().1).clone(); + let mut state = (*response.last().unwrap().full_state).clone(); state.extend(added.iter().copied()); let removed = (*removed).clone(); for r in &removed { state.remove(r); } - response.push(( + response.push(CompressedStateLayer { shortstatehash, - Arc::new(state), + full_state: Arc::new(state), added, - Arc::new(removed), - )); + removed: Arc::new(removed), + }); self.stateinfo_cache .lock() @@ -90,8 +73,12 @@ impl Service { Ok(response) } else { - let response = - vec![(shortstatehash, added.clone(), added, removed)]; + let response = vec![CompressedStateLayer { + shortstatehash, + full_state: added.clone(), + added, + removed, + }]; self.stateinfo_cache .lock() .unwrap() @@ -167,16 +154,7 @@ impl Service { statediffnew: Arc>, statediffremoved: Arc>, diff_to_sibling: usize, - mut parent_states: Vec<( - // shortstatehash - u64, - // full state - Arc>, - // added - Arc>, - // removed - Arc>, - )>, + mut parent_states: Vec, ) -> Result<()> { let diffsum = statediffnew.len() + statediffremoved.len(); @@ -185,8 +163,8 @@ impl Service { // To many layers, we have to go deeper let parent = parent_states.pop().unwrap(); - let mut parent_new = (*parent.2).clone(); - let mut parent_removed = (*parent.3).clone(); + let mut parent_new = (*parent.added).clone(); + let mut parent_removed = (*parent.removed).clone(); for removed in statediffremoved.iter() { if !parent_new.remove(removed) { @@ -236,12 +214,12 @@ impl Service { // 2. We replace a layer above let parent = parent_states.pop().unwrap(); - let parent_diff = parent.2.len() + parent.3.len(); + let parent_diff = parent.added.len() + parent.removed.len(); if diffsum * diffsum >= 2 * diff_to_sibling * parent_diff { // Diff too big, we replace above layer(s) - let mut parent_new = (*parent.2).clone(); - let mut parent_removed = (*parent.3).clone(); + let mut parent_new = (*parent.added).clone(); + let mut parent_removed = (*parent.removed).clone(); for removed in statediffremoved.iter() { if !parent_new.remove(removed) { @@ -273,7 +251,7 @@ impl Service { self.db.save_statediff( shortstatehash, StateDiff { - parent: Some(parent.0), + parent: Some(parent.shortstatehash), added: statediffnew, removed: statediffremoved, }, @@ -325,12 +303,12 @@ impl Service { let (statediffnew, statediffremoved) = if let Some(parent_stateinfo) = states_parents.last() { let statediffnew: HashSet<_> = new_state_ids_compressed - .difference(&parent_stateinfo.1) + .difference(&parent_stateinfo.full_state) .copied() .collect(); let statediffremoved: HashSet<_> = parent_stateinfo - .1 + .full_state .difference(&new_state_ids_compressed) .copied() .collect();