From 8c43c7523b37a595cc9b6cddcf22da78d560c46b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Mart=C3=ADn?= Date: Mon, 22 Jul 2024 16:27:31 +0200 Subject: [PATCH] fixup!: don't use `StateChanges` to keep the `pinned_events` list, use `Vec::extend` and `Vec::extend_from_slice` instead of cloning --- crates/matrix-sdk-base/src/client.rs | 36 ++++++++++++------- crates/matrix-sdk-base/src/rooms/normal.rs | 2 +- .../matrix-sdk-base/src/sliding_sync/mod.rs | 9 +++++ crates/matrix-sdk-base/src/store/mod.rs | 3 -- crates/matrix-sdk-sqlite/src/state_store.rs | 1 - 5 files changed, 33 insertions(+), 18 deletions(-) diff --git a/crates/matrix-sdk-base/src/client.rs b/crates/matrix-sdk-base/src/client.rs index 5c89ddbf707..e683eba8f0e 100644 --- a/crates/matrix-sdk-base/src/client.rs +++ b/crates/matrix-sdk-base/src/client.rs @@ -57,7 +57,7 @@ use ruma::{ }, push::{Action, PushConditionRoomCtx, Ruleset}, serde::Raw, - OwnedRoomId, OwnedUserId, RoomId, RoomVersionId, UInt, UserId, + OwnedEventId, OwnedRoomId, OwnedUserId, RoomId, RoomVersionId, UInt, UserId, }; use tokio::sync::{broadcast, Mutex}; #[cfg(feature = "e2e-encryption")] @@ -530,6 +530,7 @@ impl BaseClient { room_info: &mut RoomInfo, changes: &mut StateChanges, ambiguity_cache: &mut AmbiguityCache, + pinned_events: &mut Vec, ) -> StoreResult> { let mut state_events = BTreeMap::new(); let mut user_ids = BTreeSet::new(); @@ -552,10 +553,9 @@ impl BaseClient { handle_room_member_event_for_profiles(&room_info.room_id, member, changes); } else if let AnySyncStateEvent::RoomPinnedEvents( SyncRoomPinnedEventsEvent::Original(ev), - ) = &event + ) = event { - let new_pinned_event_ids = ev.content.pinned.clone(); - changes.pinned_events.insert(room_info.room_id.to_owned(), new_pinned_event_ids); + pinned_events.extend_from_slice(&ev.content.pinned); } state_events @@ -921,6 +921,7 @@ impl BaseClient { let state_events = Self::deserialize_state_events(&new_info.state.events); let (raw_state_events, state_events): (Vec<_>, Vec<_>) = state_events.into_iter().unzip(); + let mut pinned_events = Vec::new(); let mut user_ids = self .handle_state( @@ -929,9 +930,17 @@ impl BaseClient { &mut room_info, &mut changes, &mut ambiguity_cache, + &mut pinned_events, ) .await?; + if !pinned_events.is_empty() { + room.pinned_event_ids.update(|ids| { + ids.clear(); + ids.extend(pinned_events); + }); + } + for raw in &new_info.ephemeral.events { match raw.deserialize() { Ok(AnySyncEphemeralRoomEvent::Receipt(event)) => { @@ -1037,6 +1046,8 @@ impl BaseClient { let (raw_state_events, state_events): (Vec<_>, Vec<_>) = state_events.into_iter().unzip(); + let mut pinned_events = Vec::new(); + let mut user_ids = self .handle_state( &raw_state_events, @@ -1044,6 +1055,7 @@ impl BaseClient { &mut room_info, &mut changes, &mut ambiguity_cache, + &mut pinned_events, ) .await?; @@ -1062,6 +1074,13 @@ impl BaseClient { ) .await?; + if !pinned_events.is_empty() { + room.pinned_event_ids.update(|ids| { + ids.clear(); + ids.extend(pinned_events); + }); + } + // Save the new `RoomInfo`. changes.add_room(room_info); @@ -1180,15 +1199,6 @@ impl BaseClient { } } - for (room_id, pinned_event_ids) in changes.pinned_events.clone() { - if let Some(room) = self.store.room(&room_id) { - room.pinned_event_ids.update(|ids| { - ids.clear(); - ids.append(&mut pinned_event_ids.clone()); - }); - } - } - for (room_id, room_info) in &changes.room_infos { if let Some(room) = self.store.room(room_id) { let room_info_notable_update_reasons = diff --git a/crates/matrix-sdk-base/src/rooms/normal.rs b/crates/matrix-sdk-base/src/rooms/normal.rs index 61141dfe662..422b6da51dc 100644 --- a/crates/matrix-sdk-base/src/rooms/normal.rs +++ b/crates/matrix-sdk-base/src/rooms/normal.rs @@ -135,7 +135,7 @@ pub struct Room { /// The list of pinned event ids in this room in an observable format so /// they can be subscribed to. - pub pinned_event_ids: SharedObservable>, + pub(crate) pinned_event_ids: SharedObservable>, } /// The room summary containing member counts and members that should be used to diff --git a/crates/matrix-sdk-base/src/sliding_sync/mod.rs b/crates/matrix-sdk-base/src/sliding_sync/mod.rs index 2294c26ff39..d05e5189812 100644 --- a/crates/matrix-sdk-base/src/sliding_sync/mod.rs +++ b/crates/matrix-sdk-base/src/sliding_sync/mod.rs @@ -421,6 +421,7 @@ impl BaseClient { room_info.mark_state_partially_synced(); + let mut pinned_event_ids = Vec::new(); let mut user_ids = if !state_events.is_empty() { self.handle_state( &raw_state_events, @@ -428,12 +429,20 @@ impl BaseClient { &mut room_info, changes, ambiguity_cache, + &mut pinned_event_ids, ) .await? } else { Default::default() }; + if !pinned_event_ids.is_empty() { + room.pinned_event_ids.update(|ids| { + ids.clear(); + ids.extend(pinned_event_ids); + }); + } + let push_rules = self.get_push_rules(changes).await?; if let Some(invite_state) = &room_data.invite_state { diff --git a/crates/matrix-sdk-base/src/store/mod.rs b/crates/matrix-sdk-base/src/store/mod.rs index d4307424731..560842e6511 100644 --- a/crates/matrix-sdk-base/src/store/mod.rs +++ b/crates/matrix-sdk-base/src/store/mod.rs @@ -340,9 +340,6 @@ pub struct StateChanges { /// A map from room id to a map of a display name and a set of user ids that /// share that display name in the given room. pub ambiguity_maps: BTreeMap>>, - - /// A map of `RoomId` to pinned `OwnedEventId`s for each room. - pub pinned_events: BTreeMap>, } impl StateChanges { diff --git a/crates/matrix-sdk-sqlite/src/state_store.rs b/crates/matrix-sdk-sqlite/src/state_store.rs index c3d723a0e82..a6fa9a02b56 100644 --- a/crates/matrix-sdk-sqlite/src/state_store.rs +++ b/crates/matrix-sdk-sqlite/src/state_store.rs @@ -1007,7 +1007,6 @@ impl StateStore for SqliteStateStore { redactions, stripped_state, ambiguity_maps, - pinned_events: _, } = changes; if let Some(sync_token) = sync_token {