Remove so many allocations for auth chain, address review

This commit is contained in:
Devin Ragotzy 2021-04-29 13:49:04 -04:00 committed by Devin Ragotzy
parent 41b8c14d6e
commit 509283d947
4 changed files with 21 additions and 21 deletions

View File

@ -226,6 +226,8 @@ impl StateResolution {
_room_id: &RoomId, _room_id: &RoomId,
auth_event_ids: &[Vec<EventId>], auth_event_ids: &[Vec<EventId>],
) -> Result<Vec<EventId>> { ) -> Result<Vec<EventId>> {
use itertools::Itertools;
let mut chains = vec![]; let mut chains = vec![];
for ids in auth_event_ids { for ids in auth_event_ids {
@ -235,17 +237,15 @@ impl StateResolution {
chains.push(chain); chains.push(chain);
} }
if let Some(chain) = chains.first() { if let Some(chain) = chains.first().cloned() {
let rest = chains.iter().skip(1).flatten().cloned().collect(); let rest = chains.iter().skip(1).flatten().cloned().collect();
let common = chain.intersection(&rest).collect::<Vec<_>>(); let common = chain.intersection(&rest).collect::<Vec<_>>();
Ok(chains Ok(chains
.iter() .into_iter()
.flatten() .flatten()
.filter(|id| !common.contains(&id)) .filter(|id| !common.contains(&id))
.cloned() .dedup()
.collect::<BTreeSet<_>>()
.into_iter()
.collect()) .collect())
} else { } else {
Ok(vec![]) Ok(vec![])

View File

@ -38,18 +38,19 @@ pub struct RoomVersion {
/// not sure /// not sure
pub enforce_key_validity: bool, pub enforce_key_validity: bool,
// bool: before MSC2261/MSC2432,
/// `m.room.aliases` had special auth rules and redaction rules /// `m.room.aliases` had special auth rules and redaction rules
/// before room version 6. /// before room version 6.
///
/// before MSC2261/MSC2432,
pub special_case_aliases_auth: bool, pub special_case_aliases_auth: bool,
/// Strictly enforce canonicaljson, do not allow: /// Strictly enforce canonicaljson, do not allow:
/// * Integers outside the range of [-2 ^ 53 + 1, 2 ^ 53 - 1] /// * Integers outside the range of [-2 ^ 53 + 1, 2 ^ 53 - 1]
/// * Floats /// * Floats
/// * NaN, Infinity, -Infinity /// * NaN, Infinity, -Infinity
pub strict_canonicaljson: bool, pub strict_canonicaljson: bool,
// bool: MSC2209: Check 'notifications' key while verifying
// m.room.power_levels auth rules.
/// Verify notifications key while checking m.room.power_levels. /// Verify notifications key while checking m.room.power_levels.
///
/// bool: MSC2209: Check 'notifications'
pub limit_notifications_power_levels: bool, pub limit_notifications_power_levels: bool,
/// Extra rules when verifying redaction events. /// Extra rules when verifying redaction events.
pub extra_redaction_checks: bool, pub extra_redaction_checks: bool,
@ -73,7 +74,7 @@ impl RoomVersion {
}) })
} }
fn version_1() -> Self { pub fn version_1() -> Self {
Self { Self {
version: RoomVersionId::Version1, version: RoomVersionId::Version1,
disposition: RoomDisposition::Stable, disposition: RoomDisposition::Stable,
@ -87,7 +88,7 @@ impl RoomVersion {
} }
} }
fn version_2() -> Self { pub fn version_2() -> Self {
Self { Self {
version: RoomVersionId::Version2, version: RoomVersionId::Version2,
disposition: RoomDisposition::Stable, disposition: RoomDisposition::Stable,
@ -101,7 +102,7 @@ impl RoomVersion {
} }
} }
fn version_3() -> Self { pub fn version_3() -> Self {
Self { Self {
version: RoomVersionId::Version3, version: RoomVersionId::Version3,
disposition: RoomDisposition::Stable, disposition: RoomDisposition::Stable,
@ -115,7 +116,7 @@ impl RoomVersion {
} }
} }
fn version_4() -> Self { pub fn version_4() -> Self {
Self { Self {
version: RoomVersionId::Version4, version: RoomVersionId::Version4,
disposition: RoomDisposition::Stable, disposition: RoomDisposition::Stable,
@ -129,7 +130,7 @@ impl RoomVersion {
} }
} }
fn version_5() -> Self { pub fn version_5() -> Self {
Self { Self {
version: RoomVersionId::Version5, version: RoomVersionId::Version5,
disposition: RoomDisposition::Stable, disposition: RoomDisposition::Stable,
@ -143,7 +144,7 @@ impl RoomVersion {
} }
} }
fn version_6() -> Self { pub fn version_6() -> Self {
Self { Self {
version: RoomVersionId::Version6, version: RoomVersionId::Version6,
disposition: RoomDisposition::Stable, disposition: RoomDisposition::Stable,

View File

@ -1,6 +1,6 @@
use std::collections::BTreeMap; use std::collections::BTreeMap;
use ruma::{events::EventType, EventId, RoomVersionId}; use ruma::{events::EventType, EventId};
use state_res::{is_power_event, room_version::RoomVersion, StateMap}; use state_res::{is_power_event, room_version::RoomVersion, StateMap};
mod utils; mod utils;
@ -46,7 +46,7 @@ fn test_event_sort() {
// TODO we may be able to skip this since they are resolved according to spec // TODO we may be able to skip this since they are resolved according to spec
let resolved_power = state_res::StateResolution::iterative_auth_check( let resolved_power = state_res::StateResolution::iterative_auth_check(
&room_id(), &room_id(),
&RoomVersion::new(&RoomVersionId::Version6).unwrap(), &RoomVersion::version_6(),
&sorted_power_events, &sorted_power_events,
&BTreeMap::new(), // unconflicted events &BTreeMap::new(), // unconflicted events
&mut events, &mut events,

View File

@ -260,6 +260,7 @@ impl<E: Event> TestStore<E> {
room_id: &RoomId, room_id: &RoomId,
event_ids: Vec<Vec<EventId>>, event_ids: Vec<Vec<EventId>>,
) -> Result<Vec<EventId>> { ) -> Result<Vec<EventId>> {
use itertools::Itertools;
let mut chains = vec![]; let mut chains = vec![];
for ids in event_ids { for ids in event_ids {
// TODO state store `auth_event_ids` returns self in the event ids list // TODO state store `auth_event_ids` returns self in the event ids list
@ -271,17 +272,15 @@ impl<E: Event> TestStore<E> {
chains.push(chain); chains.push(chain);
} }
if let Some(chain) = chains.first() { if let Some(chain) = chains.first().cloned() {
let rest = chains.iter().skip(1).flatten().cloned().collect(); let rest = chains.iter().skip(1).flatten().cloned().collect();
let common = chain.intersection(&rest).collect::<Vec<_>>(); let common = chain.intersection(&rest).collect::<Vec<_>>();
Ok(chains Ok(chains
.iter() .into_iter()
.flatten() .flatten()
.filter(|id| !common.contains(&id)) .filter(|id| !common.contains(&id))
.cloned() .dedup()
.collect::<BTreeSet<_>>()
.into_iter()
.collect()) .collect())
} else { } else {
Ok(vec![]) Ok(vec![])