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();