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

View File

@ -118,7 +118,7 @@ where
info!("start m.room.create check");
// 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");
return Ok(false);
}
@ -431,7 +431,7 @@ fn valid_membership_change<E: 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);
}
}

View File

@ -341,8 +341,8 @@ where
let event = fetch_event(event_id);
let mut pl = None;
for aid in event.as_ref().map(|pdu| pdu.auth_events()).unwrap_or_default() {
if let Some(aev) = fetch_event(&aid) {
for aid in event.as_ref().map(|pdu| pdu.auth_events()).into_iter().flatten() {
if let Some(aev) = fetch_event(aid) {
if is_type_and_key(&aev, &EventType::RoomPowerLevels, "") {
pl = Some(aev);
break;
@ -402,7 +402,7 @@ where
.ok_or_else(|| Error::InvalidPdu("State event had no state key".to_owned()))?;
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) {
// TODO synapse check "rejected_reason" which is most likely
// related to soft-failing
@ -439,7 +439,7 @@ where
debug!("event to check {:?}", event.event_id());
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
// search for it
@ -502,9 +502,8 @@ where
let event =
fetch_event(&p).ok_or_else(|| Error::NotFound(format!("Failed to find {}", p)))?;
let auth_events = &event.auth_events();
pl = None;
for aid in auth_events {
for aid in event.auth_events() {
let ev = fetch_event(aid)
.ok_or_else(|| Error::NotFound(format!("Failed to find {}", aid)))?;
if is_type_and_key(&ev, &EventType::RoomPowerLevels, "") {
@ -566,9 +565,8 @@ where
return Ok(*depth);
}
let auth_events = &sort_ev.auth_events();
event = None;
for aid in auth_events {
for aid in sort_ev.auth_events() {
let aev = fetch_event(aid)
.ok_or_else(|| Error::NotFound(format!("Failed to find {}", aid)))?;
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() {
graph.entry(eid.clone()).or_default();
// 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 !graph.contains_key(aid) {
state.push(aid.clone());

View File

@ -30,7 +30,8 @@ pub trait Event {
fn state_key(&self) -> Option<&str>;
/// 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.
///
@ -38,7 +39,8 @@ pub trait Event {
fn depth(&self) -> &UInt;
/// 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.
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)?;
stack.extend(event.auth_events().clone());
stack.extend(event.auth_events().cloned());
}
Ok(result)
@ -599,13 +599,13 @@ pub mod event {
fn state_key(&self) -> Option<&str> {
Some(self.state_key())
}
fn prev_events(&self) -> Vec<EventId> {
fn prev_events(&self) -> Box<dyn DoubleEndedIterator<Item = &EventId> + '_> {
self.prev_event_ids()
}
fn depth(&self) -> &UInt {
self.depth()
}
fn auth_events(&self) -> Vec<EventId> {
fn auth_events(&self) -> Box<dyn DoubleEndedIterator<Item = &EventId> + '_> {
self.auth_events()
}
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 {
Pdu::RoomV1Pdu(ev) => ev.prev_events.iter().map(|(id, _)| id).cloned().collect(),
Pdu::RoomV3Pdu(ev) => ev.prev_events.clone(),
Pdu::RoomV1Pdu(ev) => Box::new(ev.prev_events.iter().map(|(id, _)| id)),
Pdu::RoomV3Pdu(ev) => Box::new(ev.prev_events.iter()),
#[cfg(not(feature = "unstable-exhaustive-types"))]
_ => unreachable!("new PDU version"),
}
}
pub fn auth_events(&self) -> Vec<EventId> {
pub fn auth_events(&self) -> Box<dyn DoubleEndedIterator<Item = &EventId> + '_> {
match &self.rest {
Pdu::RoomV1Pdu(ev) => ev.auth_events.iter().map(|(id, _)| id).cloned().collect(),
Pdu::RoomV3Pdu(ev) => ev.auth_events.to_vec(),
Pdu::RoomV1Pdu(ev) => Box::new(ev.auth_events.iter().map(|(id, _)| id)),
Pdu::RoomV3Pdu(ev) => Box::new(ev.auth_events.iter()),
#[cfg(not(feature = "unstable-exhaustive-types"))]
_ => unreachable!("new PDU version"),
}