Skip events that fail auth

This commit is contained in:
Timo Kösters 2020-09-15 12:15:11 +02:00 committed by Devin Ragotzy
parent 33232f0a63
commit 776c476f3c

View File

@ -1,8 +1,9 @@
use std::{ use std::{
cmp::Reverse, cmp::Reverse,
collections::{BTreeMap, BTreeSet, BinaryHeap}, collections::{BTreeMap, BTreeSet, BinaryHeap},
sync::Arc,
time::SystemTime, time::SystemTime,
sync::Arc}; };
use maplit::btreeset; use maplit::btreeset;
use ruma::{ use ruma::{
@ -620,29 +621,32 @@ impl StateResolution {
.enumerate() .enumerate()
.map(|(idx, eid)| ((*eid).clone(), idx)) .map(|(idx, eid)| ((*eid).clone(), idx))
.collect::<BTreeMap<_, _>>(); .collect::<BTreeMap<_, _>>();
let mut sort_event_ids = to_sort.to_vec();
let mut order_map = BTreeMap::new(); let mut order_map = BTreeMap::new();
for (idx, ev_id) in to_sort.iter().enumerate() { for (idx, ev_id) in to_sort.iter().enumerate() {
let event = StateResolution::get_or_load_event(room_id, ev_id, event_map, store); if let Some(event) =
let depth = StateResolution::get_mainline_depth( StateResolution::get_or_load_event(room_id, ev_id, event_map, store)
room_id, {
event, if let Ok(depth) = StateResolution::get_mainline_depth(
&mainline_map, room_id,
event_map, Some(event),
store, &mainline_map,
); event_map,
order_map.insert( store,
ev_id, ) {
( order_map.insert(
depth, ev_id,
event_map (
.get(ev_id) depth,
.map(|ev| ev.origin_server_ts()) event_map
.cloned(), .get(ev_id)
ev_id, // TODO should this be a &str to sort lexically?? .map(|ev| ev.origin_server_ts())
), .cloned(),
); ev_id, // TODO should this be a &str to sort lexically??
),
);
}
}
// We yield occasionally when we're working with large data sets to // We yield occasionally when we're working with large data sets to
// ensure that we don't block the reactor loop for too long. // ensure that we don't block the reactor loop for too long.
@ -653,6 +657,7 @@ impl StateResolution {
// sort the event_ids by their depth, timestamp and EventId // sort the event_ids by their depth, timestamp and EventId
// unwrap is OK order map and sort_event_ids are from to_sort (the same Vec) // unwrap is OK order map and sort_event_ids are from to_sort (the same Vec)
let mut sort_event_ids = order_map.keys().map(|&k| k.clone()).collect::<Vec<_>>();
sort_event_ids.sort_by_key(|sort_id| order_map.get(sort_id).unwrap()); sort_event_ids.sort_by_key(|sort_id| order_map.get(sort_id).unwrap());
sort_event_ids sort_event_ids
@ -666,19 +671,21 @@ impl StateResolution {
mainline_map: &EventMap<usize>, mainline_map: &EventMap<usize>,
event_map: &mut EventMap<Arc<StateEvent>>, event_map: &mut EventMap<Arc<StateEvent>>,
store: &dyn StateStore, store: &dyn StateStore,
) -> usize { ) -> Result<usize> {
while let Some(sort_ev) = event { while let Some(sort_ev) = event {
tracing::debug!("mainline event_id {}", sort_ev.event_id().to_string()); tracing::debug!("mainline event_id {}", sort_ev.event_id().to_string());
let id = sort_ev.event_id(); let id = sort_ev.event_id();
if let Some(depth) = mainline_map.get(&id) { if let Some(depth) = mainline_map.get(&id) {
return *depth; return Ok(*depth);
} }
dbg!(&sort_ev);
let auth_events = sort_ev.auth_events(); let auth_events = sort_ev.auth_events();
event = None; event = None;
for aid in auth_events { for aid in auth_events {
let aev = dbg!(&aid);
StateResolution::get_or_load_event(room_id, &aid, event_map, store).unwrap(); let aev = StateResolution::get_or_load_event(room_id, &aid, event_map, store)
.ok_or(Error::NotFound("Auth event not found".to_owned()))?;
if aev.is_type_and_key(EventType::RoomPowerLevels, "") { if aev.is_type_and_key(EventType::RoomPowerLevels, "") {
event = Some(aev); event = Some(aev);
break; break;
@ -686,7 +693,7 @@ impl StateResolution {
} }
} }
// Did not find a power level event so we default to zero // Did not find a power level event so we default to zero
0 Ok(0)
} }
fn add_event_and_auth_chain_to_graph( fn add_event_and_auth_chain_to_graph(
@ -737,7 +744,7 @@ impl StateResolution {
} }
if let Ok(e) = store.get_event(room_id, ev_id) { if let Ok(e) = store.get_event(room_id, ev_id) {
return Some(Arc::clone(event_map.entry(ev_id.clone()).or_insert(e))) return Some(Arc::clone(event_map.entry(ev_id.clone()).or_insert(e)));
} }
None None