From 64a08262ca5c0be4fca8c68c05d75edcbbfbccd4 Mon Sep 17 00:00:00 2001 From: timedout Date: Fri, 10 Jul 2026 22:59:12 +0100 Subject: [PATCH] perf: Change signature of `build_local_dag` to remove refmap hacks --- src/api/server/send.rs | 6 +----- .../event_handler/fetch_and_handle_outliers.rs | 8 ++------ src/service/rooms/event_handler/fetch_auth.rs | 13 +++---------- src/service/rooms/event_handler/fetch_prev.rs | 6 ++---- src/service/rooms/event_handler/mod.rs | 2 +- 5 files changed, 9 insertions(+), 26 deletions(-) diff --git a/src/api/server/send.rs b/src/api/server/send.rs index dde08a100..1615d513b 100644 --- a/src/api/server/send.rs +++ b/src/api/server/send.rs @@ -306,11 +306,7 @@ async fn handle_room( // failure (e.g., cycles). This is best-effort; proper ordering is the sender's // responsibility. let sorted_event_ids = if pdu_map.len() >= 2 { - let refmap = pdu_map - .iter() - .map(|(event_id, obj)| (event_id.clone(), obj)) - .collect(); - build_local_dag(&refmap, DagBuilderTree::PrevEvents) + build_local_dag(&pdu_map, DagBuilderTree::PrevEvents) .await .unwrap_or_else(|e| { debug_warn!("Failed to build local DAG for room {room_id}: {e}"); diff --git a/src/service/rooms/event_handler/fetch_and_handle_outliers.rs b/src/service/rooms/event_handler/fetch_and_handle_outliers.rs index 655b24429..c5a7fe1e2 100644 --- a/src/service/rooms/event_handler/fetch_and_handle_outliers.rs +++ b/src/service/rooms/event_handler/fetch_and_handle_outliers.rs @@ -42,7 +42,7 @@ pub enum DagBuilderTree { /// not account for power levels or other tie breaks. #[allow(clippy::implicit_hasher)] pub async fn build_local_dag( - pdu_map: &HashMap, + pdu_map: &HashMap, tree: DagBuilderTree, ) -> Result> { debug_assert!(pdu_map.len() >= 2, "needless call to build_local_dag with less than 2 PDUs"); @@ -538,11 +538,7 @@ pub(super) async fn fetch_and_handle_auth_events( } } - let refmap: HashMap = discovered_events - .iter() - .map(|(id, data)| (id.clone(), data)) - .collect(); - let seeded_ordered = build_local_dag(&refmap, DagBuilderTree::AuthEvents) + let seeded_ordered = build_local_dag(&discovered_events, DagBuilderTree::AuthEvents) .await .expect("failed to build local DAG"); let mut pdus = HashMap::with_capacity(seeded_ordered.len()); diff --git a/src/service/rooms/event_handler/fetch_auth.rs b/src/service/rooms/event_handler/fetch_auth.rs index b36fef05d..ea99b4afb 100644 --- a/src/service/rooms/event_handler/fetch_auth.rs +++ b/src/service/rooms/event_handler/fetch_auth.rs @@ -2,8 +2,7 @@ use conduwuit::{Err, Event, EventTypeExt, PduEvent, Result, err, warn}; use ruma::{ - CanonicalJsonObject, OwnedEventId, ServerName, - api::federation::authorization::get_event_authorization, + OwnedEventId, ServerName, api::federation::authorization::get_event_authorization, room_version_rules::RoomVersionRules, }; use tokio::join; @@ -126,17 +125,11 @@ async fn authorise_remote_auth_chain( where Pdu: Event + Send + Sync, { - // TODO(nex): build_local_dag's signature needs changing because all callsites - // seem to do this refmap hack. let pdu_objects = auth_chain_map .iter() - .map(|(event_id, pdu)| (event_id, pdu.to_canonical_object())) + .map(|(event_id, pdu)| (event_id.clone(), pdu.to_canonical_object())) .collect::>(); - let refmap: HashMap = pdu_objects - .iter() - .map(|(id, data)| ((*id).to_owned(), data)) - .collect(); - let auth_chain_topo = build_local_dag(&refmap, DagBuilderTree::AuthEvents) + let auth_chain_topo = build_local_dag(&pdu_objects, DagBuilderTree::AuthEvents) .await? .into_iter() .map(|event_id| (event_id.clone(), auth_chain_map.get(&event_id).unwrap().to_owned())) diff --git a/src/service/rooms/event_handler/fetch_prev.rs b/src/service/rooms/event_handler/fetch_prev.rs index 3f7e845f6..387d56031 100644 --- a/src/service/rooms/event_handler/fetch_prev.rs +++ b/src/service/rooms/event_handler/fetch_prev.rs @@ -5,7 +5,7 @@ utils::{BoolExt, IterStream, stream::BroadbandExt}, }; use futures::StreamExt; -use ruma::{CanonicalJsonObject, MilliSecondsSinceUnixEpoch, OwnedEventId, RoomId, ServerName}; +use ruma::{MilliSecondsSinceUnixEpoch, RoomId, ServerName}; use crate::rooms::event_handler::{build_local_dag, fetch_and_handle_outliers::DagBuilderTree}; @@ -87,9 +87,7 @@ pub(super) async fn fetch_prevs( let to_persist = if mapped.len() <= 1 { mapped.keys().map(ToOwned::to_owned).collect() } else { - let refmap: HashMap = - mapped.iter().map(|(id, data)| (id.clone(), data)).collect(); - build_local_dag(&refmap, DagBuilderTree::PrevEvents).await? + build_local_dag(&mapped, DagBuilderTree::PrevEvents).await? }; let job_start = Instant::now(); diff --git a/src/service/rooms/event_handler/mod.rs b/src/service/rooms/event_handler/mod.rs index b21f2fe2e..3788a961b 100644 --- a/src/service/rooms/event_handler/mod.rs +++ b/src/service/rooms/event_handler/mod.rs @@ -20,7 +20,7 @@ DagBuilderTree, GET_MISSING_EVENTS_MAX_BATCH_SIZE, build_local_dag, }; use ruma::{ - OwnedEventId, OwnedRoomId, RoomId, events::room::create::RoomCreateEventContent, + OwnedEventId, OwnedRoomId, events::room::create::RoomCreateEventContent, room_version_rules::RoomVersionRules, }; use tokio::sync::{Notify, mpsc};