diff --git a/src/database/rooms.rs b/src/database/rooms.rs index 99f0c83..4a3ab71 100644 --- a/src/database/rooms.rs +++ b/src/database/rooms.rs @@ -844,6 +844,19 @@ impl Rooms { .transpose() } + /// Returns the json of a pdu. + pub fn get_outlier_pdu_json( + &self, + event_id: &EventId, + ) -> Result> { + self.eventid_outlierpdu + .get(event_id.as_bytes())? + .map(|pdu| { + serde_json::from_slice(&pdu).map_err(|_| Error::bad_database("Invalid PDU in db.")) + }) + .transpose() + } + /// Returns the json of a pdu. pub fn get_non_outlier_pdu_json( &self, diff --git a/src/server_server.rs b/src/server_server.rs index e722126..a293d1b 100644 --- a/src/server_server.rs +++ b/src/server_server.rs @@ -887,10 +887,10 @@ pub async fn handle_incoming_pdu<'a>( let mut todo_outlier_stack = incoming_pdu.prev_events.clone(); let mut todo_timeline_stack = Vec::new(); while let Some(prev_event_id) = todo_outlier_stack.pop() { - if let Some((pdu, Some(json))) = fetch_and_handle_outliers( + if let Some((pdu, json_opt)) = fetch_and_handle_outliers( db, origin, - &[prev_event_id], + &[prev_event_id.clone()], &create_event, &room_id, pub_key_map, @@ -898,15 +898,17 @@ pub async fn handle_incoming_pdu<'a>( .await .pop() { - if incoming_pdu.origin_server_ts - > db.rooms - .first_pdu_in_room(&room_id) - .map_err(|_| "Error loading first room event.".to_owned())? - .expect("Room exists") - .origin_server_ts - { - todo_outlier_stack.extend(pdu.prev_events.iter().cloned()); - todo_timeline_stack.push((pdu, json)); + if let Some(json) = json_opt.or_else(|| db.rooms.get_outlier_pdu_json(&prev_event_id).ok().flatten()) { + if incoming_pdu.origin_server_ts + > db.rooms + .first_pdu_in_room(&room_id) + .map_err(|_| "Error loading first room event.".to_owned())? + .expect("Room exists") + .origin_server_ts + { + todo_outlier_stack.extend(pdu.prev_events.iter().cloned()); + todo_timeline_stack.push((pdu, json)); + } } } }