diff --git a/src/database.rs b/src/database.rs index d625a10f..4979d1e7 100644 --- a/src/database.rs +++ b/src/database.rs @@ -236,8 +236,6 @@ pub(crate) struct KeyValueDatabase { pub(super) senderkey_pusher: Arc, // Uncategorized trees - pub(super) statekeyshort_cache: - Mutex>, pub(super) shortstatekey_cache: Mutex>, pub(super) our_real_users_cache: @@ -471,14 +469,6 @@ impl KeyValueDatabase { shortstatekey_cache: Mutex::new(LruCache::new( (100_000.0 * config.cache_capacity_modifier) as usize, )), - #[allow( - clippy::as_conversions, - clippy::cast_sign_loss, - clippy::cast_possible_truncation - )] - statekeyshort_cache: Mutex::new(LruCache::new( - (100_000.0 * config.cache_capacity_modifier) as usize, - )), our_real_users_cache: RwLock::new(HashMap::new()), appservice_in_room_cache: RwLock::new(HashMap::new()), lasttimelinecount_cache: Mutex::new(HashMap::new()), diff --git a/src/database/key_value/rooms/short.rs b/src/database/key_value/rooms/short.rs index c60f1bb8..ec3fcf8d 100644 --- a/src/database/key_value/rooms/short.rs +++ b/src/database/key_value/rooms/short.rs @@ -47,18 +47,6 @@ impl service::rooms::short::Data for KeyValueDatabase { event_type: &StateEventType, state_key: &str, ) -> Result> { - let lookup = Lookup::StateKeyToShort; - - if let Some(short) = self - .statekeyshort_cache - .lock() - .unwrap() - .get_mut(&(event_type.clone(), state_key.to_owned())) - { - METRICS.record_lookup(lookup, FoundIn::Cache); - return Ok(Some(*short)); - } - let mut db_key = event_type.to_string().as_bytes().to_vec(); db_key.push(0xFF); db_key.extend_from_slice(state_key.as_bytes()); @@ -75,17 +63,6 @@ impl service::rooms::short::Data for KeyValueDatabase { }) .transpose()?; - if let Some(s) = short { - METRICS.record_lookup(lookup, FoundIn::Database); - - self.statekeyshort_cache - .lock() - .unwrap() - .insert((event_type.clone(), state_key.to_owned()), s); - } else { - METRICS.record_lookup(lookup, FoundIn::Nothing); - } - Ok(short) } @@ -94,50 +71,32 @@ impl service::rooms::short::Data for KeyValueDatabase { &self, event_type: &StateEventType, state_key: &str, - ) -> Result { - let lookup = Lookup::CreateStateKeyToShort; - - if let Some(short) = self - .statekeyshort_cache - .lock() - .unwrap() - .get_mut(&(event_type.clone(), state_key.to_owned())) - { - METRICS.record_lookup(lookup, FoundIn::Cache); - return Ok(*short); - } - + ) -> Result<(ShortStateKey, bool)> { let mut db_key = event_type.to_string().as_bytes().to_vec(); db_key.push(0xFF); db_key.extend_from_slice(state_key.as_bytes()); - let short = if let Some(shortstatekey) = + let (short, created) = if let Some(shortstatekey) = self.statekey_shortstatekey.get(&db_key)? { - METRICS.record_lookup(lookup, FoundIn::Database); - - utils::u64_from_bytes(&shortstatekey).map_err(|_| { - Error::bad_database("Invalid shortstatekey in db.") - })? + ( + utils::u64_from_bytes(&shortstatekey).map_err(|_| { + Error::bad_database("Invalid shortstatekey in db.") + })?, + false, + ) } else { - METRICS.record_lookup(lookup, FoundIn::Nothing); - let shortstatekey = services().globals.next_count()?; self.statekey_shortstatekey .insert(&db_key, &shortstatekey.to_be_bytes())?; self.shortstatekey_statekey .insert(&shortstatekey.to_be_bytes(), &db_key)?; - shortstatekey + (shortstatekey, true) }; let short = ShortStateKey::new(short); - self.statekeyshort_cache - .lock() - .unwrap() - .insert((event_type.clone(), state_key.to_owned()), short); - - Ok(short) + Ok((short, created)) } #[tracing::instrument(skip(self))] diff --git a/src/service.rs b/src/service.rs index d25dfe7c..f99cac9f 100644 --- a/src/service.rs +++ b/src/service.rs @@ -120,6 +120,14 @@ impl Services { { (100_000.0 * config.cache_capacity_modifier) as usize }, + #[allow( + clippy::as_conversions, + clippy::cast_sign_loss, + clippy::cast_possible_truncation + )] + { + (100_000.0 * config.cache_capacity_modifier) as usize + }, ), state: rooms::state::Service { db, diff --git a/src/service/rooms/short.rs b/src/service/rooms/short.rs index 2c18e668..dc8ab423 100644 --- a/src/service/rooms/short.rs +++ b/src/service/rooms/short.rs @@ -39,6 +39,8 @@ pub(crate) struct Service { db: &'static dyn Data, shorteventid_cache: Mutex>>, eventidshort_cache: Mutex>, + statekeyshort_cache: + Mutex>, } impl Service { @@ -46,6 +48,7 @@ impl Service { db: &'static dyn Data, shorteventid_cache_size: usize, eventidshort_cache_size: usize, + statekeyshort_cache_size: usize, ) -> Self { Self { db, @@ -55,6 +58,9 @@ impl Service { eventidshort_cache: Mutex::new(LruCache::new( eventidshort_cache_size, )), + statekeyshort_cache: Mutex::new(LruCache::new( + statekeyshort_cache_size, + )), } } @@ -92,7 +98,32 @@ impl Service { event_type: &StateEventType, state_key: &str, ) -> Result> { - self.db.get_shortstatekey(event_type, state_key) + let lookup = Lookup::StateKeyToShort; + + if let Some(short) = self + .statekeyshort_cache + .lock() + .unwrap() + .get_mut(&(event_type.clone(), state_key.to_owned())) + { + METRICS.record_lookup(lookup, FoundIn::Cache); + return Ok(Some(*short)); + } + + let short = self.db.get_shortstatekey(event_type, state_key)?; + + if let Some(short) = short { + METRICS.record_lookup(lookup, FoundIn::Database); + + self.statekeyshort_cache + .lock() + .unwrap() + .insert((event_type.clone(), state_key.to_owned()), short); + } else { + METRICS.record_lookup(lookup, FoundIn::Nothing); + } + + Ok(short) } pub(crate) fn get_or_create_shortstatekey( @@ -100,7 +131,33 @@ impl Service { event_type: &StateEventType, state_key: &str, ) -> Result { - self.db.get_or_create_shortstatekey(event_type, state_key) + let lookup = Lookup::CreateStateKeyToShort; + + if let Some(short) = self + .statekeyshort_cache + .lock() + .unwrap() + .get_mut(&(event_type.clone(), state_key.to_owned())) + { + METRICS.record_lookup(lookup, FoundIn::Cache); + return Ok(*short); + } + + let (short, created) = + self.db.get_or_create_shortstatekey(event_type, state_key)?; + + if created { + METRICS.record_lookup(lookup, FoundIn::Nothing); + } else { + METRICS.record_lookup(lookup, FoundIn::Database); + } + + self.statekeyshort_cache + .lock() + .unwrap() + .insert((event_type.clone(), state_key.to_owned()), short); + + Ok(short) } pub(crate) fn get_eventid_from_short( diff --git a/src/service/rooms/short/data.rs b/src/service/rooms/short/data.rs index 7b3fe19e..b21588be 100644 --- a/src/service/rooms/short/data.rs +++ b/src/service/rooms/short/data.rs @@ -18,11 +18,12 @@ pub(crate) trait Data: Send + Sync { state_key: &str, ) -> Result>; + /// The returned bool indicates whether it was created fn get_or_create_shortstatekey( &self, event_type: &StateEventType, state_key: &str, - ) -> Result; + ) -> Result<(ShortStateKey, bool)>; fn get_eventid_from_short( &self,