From 9f75552c9b2e20f683db6b2f088c8e22a7eb552e Mon Sep 17 00:00:00 2001 From: Benjamin Bouvier Date: Thu, 22 Feb 2024 19:40:27 +0100 Subject: [PATCH] event cache: only emit an event update when there are, well, events to propagate Mostly an optimization that was also revealed by the previous version of the test failing, because it would receive an initial update with empty events. --- crates/matrix-sdk/src/event_cache/mod.rs | 31 +++++++++++++------ .../tests/integration/event_cache.rs | 6 ++-- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/crates/matrix-sdk/src/event_cache/mod.rs b/crates/matrix-sdk/src/event_cache/mod.rs index aa5843c1c..35ffb4866 100644 --- a/crates/matrix-sdk/src/event_cache/mod.rs +++ b/crates/matrix-sdk/src/event_cache/mod.rs @@ -420,17 +420,24 @@ impl RoomEventCacheInner { } // Add all the events to the backend. - trace!("adding new events"); - self.store.add_room_events(self.room.room_id(), timeline.events.clone()).await?; + if !timeline.events.is_empty() + || timeline.prev_batch.is_some() + || !ephemeral.is_empty() + || !account_data.is_empty() + || !ambiguity_changes.is_empty() + { + trace!("adding new events"); + self.store.add_room_events(self.room.room_id(), timeline.events.clone()).await?; - // Propagate events to observers. - let _ = self.sender.send(RoomEventCacheUpdate::Append { - events: timeline.events, - prev_batch: timeline.prev_batch, - ephemeral, - account_data, - ambiguity_changes, - }); + // Propagate events to observers. + let _ = self.sender.send(RoomEventCacheUpdate::Append { + events: timeline.events, + prev_batch: timeline.prev_batch, + ephemeral, + account_data, + ambiguity_changes, + }); + } Ok(()) } @@ -444,6 +451,10 @@ impl RoomEventCacheInner { /// Append a set of events to the room cache and storage, notifying /// observers. async fn append_events(&self, events: Vec) -> Result<()> { + if events.is_empty() { + return Ok(()); + } + self.store.add_room_events(self.room.room_id(), events.clone()).await?; let _ = self.sender.send(RoomEventCacheUpdate::Append { diff --git a/crates/matrix-sdk/tests/integration/event_cache.rs b/crates/matrix-sdk/tests/integration/event_cache.rs index 5996f336f..2f9dc4287 100644 --- a/crates/matrix-sdk/tests/integration/event_cache.rs +++ b/crates/matrix-sdk/tests/integration/event_cache.rs @@ -70,6 +70,9 @@ async fn test_add_initial_events() { let event_cache = client.event_cache(); + // Immediately subscribe the event cache to sync updates. + event_cache.subscribe().unwrap(); + // If I sync and get informed I've joined The Room, but with no events, let room_id = room_id!("!omelette:fromage.fr"); @@ -81,8 +84,7 @@ async fn test_add_initial_events() { client.sync_once(Default::default()).await.unwrap(); server.reset().await; - // If I create a room event subscriber, just after subscribing, - event_cache.subscribe().unwrap(); + // If I create a room event subscriber, let (room_event_cache, _drop_handles) = event_cache.for_room(room_id).await.unwrap(); let (events, mut subscriber) = room_event_cache.subscribe().await.unwrap();