Skip to content

Commit 8b2a8e7

Browse files
committed
refactor(event cache): move the timeline-event-diffs sending back into the callers
1 parent 7cad237 commit 8b2a8e7

File tree

2 files changed

+41
-43
lines changed

2 files changed

+41
-43
lines changed

crates/matrix-sdk/src/event_cache/pagination.rs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -301,10 +301,17 @@ impl RoomPagination {
301301
None
302302
};
303303

304-
state
305-
.handle_backpagination(events, new_gap, prev_gap_chunk_id, &self.inner.sender)
306-
.await
307-
.map(Some)
304+
let (outcome, timeline_event_diffs) =
305+
state.handle_backpagination(events, new_gap, prev_gap_chunk_id).await?;
306+
307+
if !timeline_event_diffs.is_empty() {
308+
let _ = self.inner.sender.send(RoomEventCacheUpdate::UpdateTimelineEvents {
309+
diffs: timeline_event_diffs,
310+
origin: EventsOrigin::Pagination,
311+
});
312+
}
313+
314+
Ok(Some(outcome))
308315
}
309316

310317
/// Returns a subscriber to the pagination status used for the

crates/matrix-sdk/src/event_cache/room/mod.rs

Lines changed: 30 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -387,27 +387,32 @@ impl RoomEventCacheInner {
387387
// Add all the events to the backend.
388388
trace!("adding new events");
389389

390-
let stored_prev_batch_token =
391-
self.state.write().await.handle_sync(timeline, &self.sender).await?;
390+
let (stored_prev_batch_token, timeline_event_diffs) =
391+
self.state.write().await.handle_sync(timeline).await?;
392392

393393
// Now that all events have been added, we can trigger the
394394
// `pagination_token_notifier`.
395395
if stored_prev_batch_token {
396396
self.pagination_batch_token_notifier.notify_one();
397397
}
398398

399-
// State sent the timeline diff updates, so we can send updates about the
400-
// related events now.
401-
{
402-
if !ephemeral_events.is_empty() {
403-
let _ = self
404-
.sender
405-
.send(RoomEventCacheUpdate::AddEphemeralEvents { events: ephemeral_events });
406-
}
399+
// The order matters here: first send the timeline event diffs, then only the
400+
// related events (read receipts, etc.).
401+
if !timeline_event_diffs.is_empty() {
402+
let _ = self.sender.send(RoomEventCacheUpdate::UpdateTimelineEvents {
403+
diffs: timeline_event_diffs,
404+
origin: EventsOrigin::Sync,
405+
});
406+
}
407407

408-
if !ambiguity_changes.is_empty() {
409-
let _ = self.sender.send(RoomEventCacheUpdate::UpdateMembers { ambiguity_changes });
410-
}
408+
if !ephemeral_events.is_empty() {
409+
let _ = self
410+
.sender
411+
.send(RoomEventCacheUpdate::AddEphemeralEvents { events: ephemeral_events });
412+
}
413+
414+
if !ambiguity_changes.is_empty() {
415+
let _ = self.sender.send(RoomEventCacheUpdate::UpdateMembers { ambiguity_changes });
411416
}
412417

413418
Ok(())
@@ -470,7 +475,6 @@ mod private {
470475
serde::Raw,
471476
EventId, OwnedEventId, OwnedRoomId, RoomVersionId,
472477
};
473-
use tokio::sync::broadcast::Sender;
474478
use tracing::{debug, error, instrument, trace, warn};
475479

476480
use super::{
@@ -479,8 +483,7 @@ mod private {
479483
sort_positions_descending, EventLocation, LoadMoreEventsBackwardsOutcome,
480484
};
481485
use crate::event_cache::{
482-
deduplicator::filter_duplicate_events, BackPaginationOutcome, EventsOrigin,
483-
RoomEventCacheUpdate, RoomPaginationStatus,
486+
deduplicator::filter_duplicate_events, BackPaginationOutcome, RoomPaginationStatus,
484487
};
485488

486489
/// State for a single room's event cache.
@@ -776,7 +779,7 @@ mod private {
776779

777780
/// Automatically shrink the room if there are no listeners, as
778781
/// indicated by the atomic number of active listeners.
779-
#[must_use = "Updates as `VectorDiff` must probably be propagated via `RoomEventCacheUpdate`"]
782+
#[must_use = "Propagate `VectorDiff` updates via `RoomEventCacheUpdate`"]
780783
pub(crate) async fn auto_shrink_if_no_listeners(
781784
&mut self,
782785
) -> Result<Option<Vec<VectorDiff<TimelineEvent>>>, EventCacheError> {
@@ -952,7 +955,7 @@ mod private {
952955
/// Return a single diff update that is a clear of all events; as a
953956
/// result, the caller may override any pending diff updates
954957
/// with the result of this function.
955-
#[must_use = "Updates as `VectorDiff` must probably be propagated via `RoomEventCacheUpdate`"]
958+
#[must_use = "Propagate `VectorDiff` updates via `RoomEventCacheUpdate`"]
956959
pub async fn reset(&mut self) -> Result<Vec<VectorDiff<TimelineEvent>>, EventCacheError> {
957960
self.reset_internal().await?;
958961

@@ -1292,11 +1295,11 @@ mod private {
12921295
///
12931296
/// Returns true if a new gap (previous-batch token) has been inserted,
12941297
/// false otherwise.
1298+
#[must_use = "Propagate `VectorDiff` updates via `RoomEventCacheUpdate`"]
12951299
pub async fn handle_sync(
12961300
&mut self,
12971301
mut timeline: Timeline,
1298-
sender: &Sender<RoomEventCacheUpdate>,
1299-
) -> Result<bool, EventCacheError> {
1302+
) -> Result<(bool, Vec<VectorDiff<TimelineEvent>>), EventCacheError> {
13001303
let mut prev_batch = timeline.prev_batch.take();
13011304

13021305
let (
@@ -1327,7 +1330,7 @@ mod private {
13271330
if all_duplicates {
13281331
// No new events and no gap (per the previous check), thus no need to change the
13291332
// room state. We're done!
1330-
return Ok(false);
1333+
return Ok((false, Vec::new()));
13311334
}
13321335

13331336
// Remove the old duplicated events.
@@ -1376,23 +1379,18 @@ mod private {
13761379
}
13771380

13781381
let timeline_event_diffs = self.events.updates_as_vector_diffs();
1379-
if !timeline_event_diffs.is_empty() {
1380-
let _ = sender.send(RoomEventCacheUpdate::UpdateTimelineEvents {
1381-
diffs: timeline_event_diffs,
1382-
origin: EventsOrigin::Sync,
1383-
});
1384-
}
13851382

1386-
Ok(prev_batch.is_some())
1383+
Ok((prev_batch.is_some(), timeline_event_diffs))
13871384
}
13881385

1386+
#[must_use = "Propagate `VectorDiff` updates via `RoomEventCacheUpdate`"]
13891387
pub async fn handle_backpagination(
13901388
&mut self,
13911389
events: Vec<TimelineEvent>,
13921390
mut new_gap: Option<Gap>,
13931391
prev_gap_id: Option<ChunkIdentifier>,
1394-
sender: &Sender<RoomEventCacheUpdate>,
1395-
) -> Result<BackPaginationOutcome, EventCacheError> {
1392+
) -> Result<(BackPaginationOutcome, Vec<VectorDiff<TimelineEvent>>), EventCacheError>
1393+
{
13961394
// If there's no new gap (previous batch token), then we've reached the start of
13971395
// the timeline.
13981396
let network_reached_start = new_gap.is_none();
@@ -1516,17 +1514,10 @@ mod private {
15161514
reached_start
15171515
};
15181516

1519-
let backpagination_outcome = BackPaginationOutcome { events, reached_start };
1520-
15211517
let event_diffs = self.events.updates_as_vector_diffs();
1522-
if !event_diffs.is_empty() {
1523-
let _ = sender.send(RoomEventCacheUpdate::UpdateTimelineEvents {
1524-
diffs: event_diffs,
1525-
origin: EventsOrigin::Pagination,
1526-
});
1527-
}
1518+
let backpagination_outcome = BackPaginationOutcome { events, reached_start };
15281519

1529-
Ok(backpagination_outcome)
1520+
Ok((backpagination_outcome, event_diffs))
15301521
}
15311522
}
15321523
}

0 commit comments

Comments
 (0)