parallelize get_auth_chain outer

Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
Jason Volk 2025-01-20 09:02:50 +00:00
parent ea25dc04b2
commit 4c0ae8c2f7

View file

@ -7,11 +7,14 @@ use std::{
}; };
use conduwuit::{ use conduwuit::{
debug, debug_error, trace, at, debug, debug_error, trace,
utils::{stream::ReadyExt, IterStream}, utils::{
stream::{ReadyExt, TryBroadbandExt},
IterStream,
},
validated, warn, Err, Result, validated, warn, Err, Result,
}; };
use futures::{Stream, StreamExt}; use futures::{Stream, StreamExt, TryStreamExt};
use ruma::{EventId, OwnedEventId, RoomId}; use ruma::{EventId, OwnedEventId, RoomId};
use self::data::Data; use self::data::Data;
@ -112,66 +115,61 @@ impl Service {
"start", "start",
); );
let mut hits: usize = 0; let full_auth_chain: Vec<_> = buckets
let mut misses: usize = 0; .into_iter()
let mut full_auth_chain = Vec::with_capacity(buckets.len()); .try_stream()
for chunk in buckets { .broad_and_then(|chunk| async move {
if chunk.is_empty() { let chunk_key: Vec<ShortEventId> = chunk.iter().map(at!(0)).collect();
continue;
if chunk_key.is_empty() {
return Ok(Vec::new());
} }
let chunk_key: Vec<ShortEventId> =
chunk.iter().map(|(short, _)| short).copied().collect();
if let Ok(cached) = self.get_cached_eventid_authchain(&chunk_key).await { if let Ok(cached) = self.get_cached_eventid_authchain(&chunk_key).await {
trace!("Found cache entry for whole chunk"); return Ok(cached.to_vec());
full_auth_chain.extend(cached.iter().copied()); }
hits = hits.saturating_add(1);
continue; let chunk_cache: Vec<_> = chunk
.into_iter()
.try_stream()
.broad_and_then(|(shortid, event_id)| async move {
if let Ok(cached) = self.get_cached_eventid_authchain(&[shortid]).await {
return Ok(cached.to_vec());
} }
let mut hits2: usize = 0;
let mut misses2: usize = 0;
let mut chunk_cache = Vec::with_capacity(chunk.len());
for (sevent_id, event_id) in chunk {
if let Ok(cached) = self.get_cached_eventid_authchain(&[sevent_id]).await {
trace!(?event_id, "Found cache entry for event");
chunk_cache.extend(cached.iter().copied());
hits2 = hits2.saturating_add(1);
} else {
let auth_chain = self.get_auth_chain_inner(room_id, event_id).await?; let auth_chain = self.get_auth_chain_inner(room_id, event_id).await?;
self.cache_auth_chain(vec![sevent_id], &auth_chain); self.cache_auth_chain_vec(vec![shortid], auth_chain.as_slice());
chunk_cache.extend(auth_chain.iter());
misses2 = misses2.saturating_add(1);
debug!( debug!(
event_id = ?event_id, ?event_id,
chain_length = ?auth_chain.len(),
chunk_cache_length = ?chunk_cache.len(),
elapsed = ?started.elapsed(), elapsed = ?started.elapsed(),
"Cache missed event" "Cache missed event"
); );
};
}
Ok(auth_chain)
})
.try_collect()
.await?;
let mut chunk_cache: Vec<_> = chunk_cache.into_iter().flatten().collect();
chunk_cache.sort_unstable(); chunk_cache.sort_unstable();
chunk_cache.dedup(); chunk_cache.dedup();
self.cache_auth_chain_vec(chunk_key, &chunk_cache); self.cache_auth_chain_vec(chunk_key, chunk_cache.as_slice());
full_auth_chain.extend(chunk_cache.iter());
misses = misses.saturating_add(1);
debug!( debug!(
chunk_cache_length = ?chunk_cache.len(), chunk_cache_length = ?chunk_cache.len(),
hits = ?hits2,
misses = ?misses2,
elapsed = ?started.elapsed(), elapsed = ?started.elapsed(),
"Chunk missed", "Cache missed chunk",
); );
}
Ok(chunk_cache)
})
.try_collect()
.await?;
let mut full_auth_chain: Vec<_> = full_auth_chain.into_iter().flatten().collect();
full_auth_chain.sort_unstable(); full_auth_chain.sort_unstable();
full_auth_chain.dedup(); full_auth_chain.dedup();
debug!( debug!(
chain_length = ?full_auth_chain.len(), chain_length = ?full_auth_chain.len(),
hits = ?hits,
misses = ?misses,
elapsed = ?started.elapsed(), elapsed = ?started.elapsed(),
"done", "done",
); );
@ -184,7 +182,7 @@ impl Service {
&self, &self,
room_id: &RoomId, room_id: &RoomId,
event_id: &EventId, event_id: &EventId,
) -> Result<HashSet<ShortEventId>> { ) -> Result<Vec<ShortEventId>> {
let mut todo: VecDeque<_> = [event_id.to_owned()].into(); let mut todo: VecDeque<_> = [event_id.to_owned()].into();
let mut found = HashSet::new(); let mut found = HashSet::new();
@ -226,7 +224,7 @@ impl Service {
} }
} }
Ok(found) Ok(found.into_iter().collect())
} }
#[inline] #[inline]