state-res: Return borrows from Event::{prev_events, auth_events}

This commit is contained in:
Jonas Platte 2021-09-05 18:31:43 +02:00
parent 34a10b87c5
commit 1e19de9579
No known key found for this signature in database
GPG Key ID: CC154DE0E30B7C67
5 changed files with 31 additions and 31 deletions

View File

@ -202,7 +202,7 @@ impl<E: Event> TestStore<E> {
let event = self.get_event(room_id, &ev_id)?; let event = self.get_event(room_id, &ev_id)?;
stack.extend(event.auth_events().clone()); stack.extend(event.auth_events().cloned());
} }
Ok(result) Ok(result)
@ -578,7 +578,7 @@ pub mod event {
self.state_key() self.state_key()
} }
fn prev_events(&self) -> Vec<EventId> { fn prev_events(&self) -> Box<dyn DoubleEndedIterator<Item = &EventId> + '_> {
self.prev_event_ids() self.prev_event_ids()
} }
@ -586,7 +586,7 @@ pub mod event {
self.depth() self.depth()
} }
fn auth_events(&self) -> Vec<EventId> { fn auth_events(&self) -> Box<dyn DoubleEndedIterator<Item = &EventId> + '_> {
self.auth_events() self.auth_events()
} }
@ -732,19 +732,19 @@ pub mod event {
} }
} }
pub fn prev_event_ids(&self) -> Vec<EventId> { pub fn prev_event_ids(&self) -> Box<dyn DoubleEndedIterator<Item = &EventId> + '_> {
match &self.rest { match &self.rest {
Pdu::RoomV1Pdu(ev) => ev.prev_events.iter().map(|(id, _)| id).cloned().collect(), Pdu::RoomV1Pdu(ev) => Box::new(ev.prev_events.iter().map(|(id, _)| id)),
Pdu::RoomV3Pdu(ev) => ev.prev_events.clone(), Pdu::RoomV3Pdu(ev) => Box::new(ev.prev_events.iter()),
#[cfg(not(feature = "unstable-exhaustive-types"))] #[cfg(not(feature = "unstable-exhaustive-types"))]
_ => unreachable!("new PDU version"), _ => unreachable!("new PDU version"),
} }
} }
pub fn auth_events(&self) -> Vec<EventId> { pub fn auth_events(&self) -> Box<dyn DoubleEndedIterator<Item = &EventId> + '_> {
match &self.rest { match &self.rest {
Pdu::RoomV1Pdu(ev) => ev.auth_events.iter().map(|(id, _)| id).cloned().collect(), Pdu::RoomV1Pdu(ev) => Box::new(ev.auth_events.iter().map(|(id, _)| id)),
Pdu::RoomV3Pdu(ev) => ev.auth_events.to_vec(), Pdu::RoomV3Pdu(ev) => Box::new(ev.auth_events.iter()),
#[cfg(not(feature = "unstable-exhaustive-types"))] #[cfg(not(feature = "unstable-exhaustive-types"))]
_ => unreachable!("new PDU version"), _ => unreachable!("new PDU version"),
} }

View File

@ -118,7 +118,7 @@ where
info!("start m.room.create check"); info!("start m.room.create check");
// If it has any previous events, reject // If it has any previous events, reject
if !incoming_event.prev_events().is_empty() { if incoming_event.prev_events().next().is_some() {
warn!("the room creation event had previous events"); warn!("the room creation event had previous events");
return Ok(false); return Ok(false);
} }
@ -431,7 +431,7 @@ fn valid_membership_change<E: Event>(
} }
if let Some(prev) = prev_event { if let Some(prev) = prev_event {
if *prev.event_type() == EventType::RoomCreate && prev.prev_events().is_empty() { if *prev.event_type() == EventType::RoomCreate && prev.prev_events().next().is_none() {
return Ok(true); return Ok(true);
} }
} }

View File

@ -341,8 +341,8 @@ where
let event = fetch_event(event_id); let event = fetch_event(event_id);
let mut pl = None; let mut pl = None;
for aid in event.as_ref().map(|pdu| pdu.auth_events()).unwrap_or_default() { for aid in event.as_ref().map(|pdu| pdu.auth_events()).into_iter().flatten() {
if let Some(aev) = fetch_event(&aid) { if let Some(aev) = fetch_event(aid) {
if is_type_and_key(&aev, &EventType::RoomPowerLevels, "") { if is_type_and_key(&aev, &EventType::RoomPowerLevels, "") {
pl = Some(aev); pl = Some(aev);
break; break;
@ -402,7 +402,7 @@ where
.ok_or_else(|| Error::InvalidPdu("State event had no state key".to_owned()))?; .ok_or_else(|| Error::InvalidPdu("State event had no state key".to_owned()))?;
let mut auth_events = HashMap::new(); let mut auth_events = HashMap::new();
for aid in &event.auth_events() { for aid in event.auth_events() {
if let Some(ev) = fetch_event(aid) { if let Some(ev) = fetch_event(aid) {
// TODO synapse check "rejected_reason" which is most likely // TODO synapse check "rejected_reason" which is most likely
// related to soft-failing // related to soft-failing
@ -439,7 +439,7 @@ where
debug!("event to check {:?}", event.event_id()); debug!("event to check {:?}", event.event_id());
let most_recent_prev_event = let most_recent_prev_event =
event.prev_events().iter().filter_map(|id| fetch_event(id)).next_back(); event.prev_events().filter_map(|id| fetch_event(id)).next_back();
// The key for this is (eventType + a state_key of the signed token not sender) so // The key for this is (eventType + a state_key of the signed token not sender) so
// search for it // search for it
@ -502,9 +502,8 @@ where
let event = let event =
fetch_event(&p).ok_or_else(|| Error::NotFound(format!("Failed to find {}", p)))?; fetch_event(&p).ok_or_else(|| Error::NotFound(format!("Failed to find {}", p)))?;
let auth_events = &event.auth_events();
pl = None; pl = None;
for aid in auth_events { for aid in event.auth_events() {
let ev = fetch_event(aid) let ev = fetch_event(aid)
.ok_or_else(|| Error::NotFound(format!("Failed to find {}", aid)))?; .ok_or_else(|| Error::NotFound(format!("Failed to find {}", aid)))?;
if is_type_and_key(&ev, &EventType::RoomPowerLevels, "") { if is_type_and_key(&ev, &EventType::RoomPowerLevels, "") {
@ -566,9 +565,8 @@ where
return Ok(*depth); return Ok(*depth);
} }
let auth_events = &sort_ev.auth_events();
event = None; event = None;
for aid in auth_events { for aid in sort_ev.auth_events() {
let aev = fetch_event(aid) let aev = fetch_event(aid)
.ok_or_else(|| Error::NotFound(format!("Failed to find {}", aid)))?; .ok_or_else(|| Error::NotFound(format!("Failed to find {}", aid)))?;
if is_type_and_key(&aev, &EventType::RoomPowerLevels, "") { if is_type_and_key(&aev, &EventType::RoomPowerLevels, "") {
@ -594,7 +592,7 @@ fn add_event_and_auth_chain_to_graph<E, F>(
while let Some(eid) = state.pop() { while let Some(eid) = state.pop() {
graph.entry(eid.clone()).or_default(); graph.entry(eid.clone()).or_default();
// Prefer the store to event as the store filters dedups the events // Prefer the store to event as the store filters dedups the events
for aid in &fetch_event(&eid).map(|ev| ev.auth_events()).unwrap_or_default() { for aid in fetch_event(&eid).as_ref().map(|ev| ev.auth_events()).into_iter().flatten() {
if auth_diff.contains(aid) { if auth_diff.contains(aid) {
if !graph.contains_key(aid) { if !graph.contains_key(aid) {
state.push(aid.clone()); state.push(aid.clone());

View File

@ -30,7 +30,8 @@ pub trait Event {
fn state_key(&self) -> Option<&str>; fn state_key(&self) -> Option<&str>;
/// The events before this event. /// The events before this event.
fn prev_events(&self) -> Vec<EventId>; // Requires GATs to avoid boxing (and TAIT for making it convenient).
fn prev_events(&self) -> Box<dyn DoubleEndedIterator<Item = &EventId> + '_>;
/// The maximum number of `prev_events` plus 1. /// The maximum number of `prev_events` plus 1.
/// ///
@ -38,7 +39,8 @@ pub trait Event {
fn depth(&self) -> &UInt; fn depth(&self) -> &UInt;
/// All the authenticating events for this event. /// All the authenticating events for this event.
fn auth_events(&self) -> Vec<EventId>; // Requires GATs to avoid boxing (and TAIT for making it convenient).
fn auth_events(&self) -> Box<dyn DoubleEndedIterator<Item = &EventId> + '_>;
/// If this event is a redaction event this is the event it redacts. /// If this event is a redaction event this is the event it redacts.
fn redacts(&self) -> Option<&EventId>; fn redacts(&self) -> Option<&EventId>;

View File

@ -244,7 +244,7 @@ impl<E: Event> TestStore<E> {
let event = self.get_event(room_id, &ev_id)?; let event = self.get_event(room_id, &ev_id)?;
stack.extend(event.auth_events().clone()); stack.extend(event.auth_events().cloned());
} }
Ok(result) Ok(result)
@ -599,13 +599,13 @@ pub mod event {
fn state_key(&self) -> Option<&str> { fn state_key(&self) -> Option<&str> {
Some(self.state_key()) Some(self.state_key())
} }
fn prev_events(&self) -> Vec<EventId> { fn prev_events(&self) -> Box<dyn DoubleEndedIterator<Item = &EventId> + '_> {
self.prev_event_ids() self.prev_event_ids()
} }
fn depth(&self) -> &UInt { fn depth(&self) -> &UInt {
self.depth() self.depth()
} }
fn auth_events(&self) -> Vec<EventId> { fn auth_events(&self) -> Box<dyn DoubleEndedIterator<Item = &EventId> + '_> {
self.auth_events() self.auth_events()
} }
fn redacts(&self) -> Option<&EventId> { fn redacts(&self) -> Option<&EventId> {
@ -748,19 +748,19 @@ pub mod event {
} }
} }
pub fn prev_event_ids(&self) -> Vec<EventId> { pub fn prev_event_ids(&self) -> Box<dyn DoubleEndedIterator<Item = &EventId> + '_> {
match &self.rest { match &self.rest {
Pdu::RoomV1Pdu(ev) => ev.prev_events.iter().map(|(id, _)| id).cloned().collect(), Pdu::RoomV1Pdu(ev) => Box::new(ev.prev_events.iter().map(|(id, _)| id)),
Pdu::RoomV3Pdu(ev) => ev.prev_events.clone(), Pdu::RoomV3Pdu(ev) => Box::new(ev.prev_events.iter()),
#[cfg(not(feature = "unstable-exhaustive-types"))] #[cfg(not(feature = "unstable-exhaustive-types"))]
_ => unreachable!("new PDU version"), _ => unreachable!("new PDU version"),
} }
} }
pub fn auth_events(&self) -> Vec<EventId> { pub fn auth_events(&self) -> Box<dyn DoubleEndedIterator<Item = &EventId> + '_> {
match &self.rest { match &self.rest {
Pdu::RoomV1Pdu(ev) => ev.auth_events.iter().map(|(id, _)| id).cloned().collect(), Pdu::RoomV1Pdu(ev) => Box::new(ev.auth_events.iter().map(|(id, _)| id)),
Pdu::RoomV3Pdu(ev) => ev.auth_events.to_vec(), Pdu::RoomV3Pdu(ev) => Box::new(ev.auth_events.iter()),
#[cfg(not(feature = "unstable-exhaustive-types"))] #[cfg(not(feature = "unstable-exhaustive-types"))]
_ => unreachable!("new PDU version"), _ => unreachable!("new PDU version"),
} }