Skip to content

Commit e9bc43a

Browse files
committed
feat(event cache): enable storage by default \o/
1 parent edf613a commit e9bc43a

File tree

6 files changed

+71
-228
lines changed

6 files changed

+71
-228
lines changed

bindings/matrix-sdk-ffi/src/client_builder.rs

Lines changed: 0 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -272,10 +272,6 @@ pub struct ClientBuilder {
272272
room_key_recipient_strategy: CollectStrategy,
273273
decryption_trust_requirement: TrustRequirement,
274274
request_config: Option<RequestConfig>,
275-
276-
/// Whether to enable use of the event cache store, for reloading events
277-
/// when building timelines et al.
278-
use_event_cache_persistent_storage: bool,
279275
}
280276

281277
#[matrix_sdk_ffi_macros::export]
@@ -306,27 +302,9 @@ impl ClientBuilder {
306302
room_key_recipient_strategy: Default::default(),
307303
decryption_trust_requirement: TrustRequirement::Untrusted,
308304
request_config: Default::default(),
309-
use_event_cache_persistent_storage: false,
310305
})
311306
}
312307

313-
/// Whether to use the event cache persistent storage or not.
314-
///
315-
/// This is a temporary feature flag, for testing the event cache's
316-
/// persistent storage. Follow new developments in https://github.com/matrix-org/matrix-rust-sdk/issues/3280.
317-
///
318-
/// This is disabled by default. When disabled, a one-time cleanup is
319-
/// performed when creating the client, and it will clear all the events
320-
/// previously stored in the event cache.
321-
///
322-
/// When enabled, it will attempt to store events in the event cache as
323-
/// they're received, and reuse them when reconstructing timelines.
324-
pub fn use_event_cache_persistent_storage(self: Arc<Self>, value: bool) -> Arc<Self> {
325-
let mut builder = unwrap_or_clone_arc(self);
326-
builder.use_event_cache_persistent_storage = value;
327-
Arc::new(builder)
328-
}
329-
330308
pub fn cross_process_store_locks_holder_name(
331309
self: Arc<Self>,
332310
holder_name: String,
@@ -649,19 +627,6 @@ impl ClientBuilder {
649627

650628
let sdk_client = inner_builder.build().await?;
651629

652-
if builder.use_event_cache_persistent_storage {
653-
// Enable the persistent storage \o/
654-
sdk_client.event_cache().enable_storage()?;
655-
} else {
656-
// Get rid of all the previous events, if any.
657-
let store = sdk_client
658-
.event_cache_store()
659-
.lock()
660-
.await
661-
.map_err(EventCacheError::LockingStorage)?;
662-
store.clear_all_rooms_chunks().await.map_err(EventCacheError::Storage)?;
663-
}
664-
665630
Ok(Arc::new(
666631
Client::new(sdk_client, builder.enable_oidc_refresh_lock, builder.session_delegate)
667632
.await?,

crates/matrix-sdk-ui/src/timeline/builder.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,6 @@ impl TimelineBuilder {
157157
let event_cache = client.event_cache();
158158

159159
// Subscribe the event cache to sync responses, in case we hadn't done it yet.
160-
event_cache.enable_storage()?;
161160
event_cache.subscribe()?;
162161

163162
let (room_event_cache, event_cache_drop) = room.event_cache().await?;

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

Lines changed: 10 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -168,23 +168,6 @@ impl EventCache {
168168
}
169169
}
170170

171-
/// Enable storing updates to storage, and reload events from storage.
172-
///
173-
/// Has an effect only the first time it's called. It's safe to call it
174-
/// multiple times.
175-
pub fn enable_storage(&self) -> Result<()> {
176-
let _ = self.inner.store.get_or_try_init::<_, EventCacheError>(|| {
177-
let client = self.inner.client()?;
178-
Ok(client.event_cache_store().clone())
179-
})?;
180-
Ok(())
181-
}
182-
183-
/// Check whether the storage is enabled or not.
184-
pub fn has_storage(&self) -> bool {
185-
self.inner.has_storage()
186-
}
187-
188171
/// Starts subscribing the [`EventCache`] to sync responses, if not done
189172
/// before.
190173
///
@@ -193,6 +176,13 @@ impl EventCache {
193176
pub fn subscribe(&self) -> Result<()> {
194177
let client = self.inner.client()?;
195178

179+
// Initialize storage.
180+
let _ = self.inner.store.get_or_try_init::<_, EventCacheError>(|| {
181+
let client = self.inner.client()?;
182+
Ok(client.event_cache_store().clone())
183+
})?;
184+
185+
// Initialize the drop handles.
196186
let _ = self.inner.drop_handles.get_or_init(|| {
197187
// Spawn the task that will listen to all the room updates at once.
198188
let listen_updates_task = spawn(Self::listen_task(
@@ -487,11 +477,6 @@ impl EventCacheInner {
487477
self.client.get().ok_or(EventCacheError::ClientDropped)
488478
}
489479

490-
/// Has persistent storage been enabled for the event cache?
491-
fn has_storage(&self) -> bool {
492-
self.store.get().is_some()
493-
}
494-
495480
/// Clears all the room's data.
496481
async fn clear_all_rooms(&self) -> Result<()> {
497482
// Note: one must NOT clear the `by_room` map, because if something subscribed
@@ -524,9 +509,7 @@ impl EventCacheInner {
524509
for (room_id, left_room_update) in updates.leave {
525510
let room = self.for_room(&room_id).await?;
526511

527-
if let Err(err) =
528-
room.inner.handle_left_room_update(self.has_storage(), left_room_update).await
529-
{
512+
if let Err(err) = room.inner.handle_left_room_update(left_room_update).await {
530513
// Non-fatal error, try to continue to the next room.
531514
error!("handling left room update: {err}");
532515
}
@@ -536,9 +519,7 @@ impl EventCacheInner {
536519
for (room_id, joined_room_update) in updates.join {
537520
let room = self.for_room(&room_id).await?;
538521

539-
if let Err(err) =
540-
room.inner.handle_joined_room_update(self.has_storage(), joined_room_update).await
541-
{
522+
if let Err(err) = room.inner.handle_joined_room_update(joined_room_update).await {
542523
// Non-fatal error, try to continue to the next room.
543524
error!("handling joined room update: {err}");
544525
}
@@ -716,10 +697,7 @@ mod tests {
716697

717698
room_event_cache
718699
.inner
719-
.handle_joined_room_update(
720-
event_cache.inner.has_storage(),
721-
JoinedRoomUpdate { account_data, ..Default::default() },
722-
)
700+
.handle_joined_room_update(JoinedRoomUpdate { account_data, ..Default::default() })
723701
.await
724702
.unwrap();
725703

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

Lines changed: 30 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -278,13 +278,8 @@ impl RoomEventCacheInner {
278278
}
279279
}
280280

281-
pub(super) async fn handle_joined_room_update(
282-
&self,
283-
has_storage: bool,
284-
updates: JoinedRoomUpdate,
285-
) -> Result<()> {
281+
pub(super) async fn handle_joined_room_update(&self, updates: JoinedRoomUpdate) -> Result<()> {
286282
self.handle_timeline(
287-
has_storage,
288283
updates.timeline,
289284
updates.ephemeral.clone(),
290285
updates.ambiguity_changes,
@@ -298,88 +293,33 @@ impl RoomEventCacheInner {
298293

299294
async fn handle_timeline(
300295
&self,
301-
has_storage: bool,
302296
timeline: Timeline,
303297
ephemeral_events: Vec<Raw<AnySyncEphemeralRoomEvent>>,
304298
ambiguity_changes: BTreeMap<OwnedEventId, AmbiguityChange>,
305299
) -> Result<()> {
306-
if !has_storage && timeline.limited {
307-
// Ideally we'd try to reconcile existing events against those received in the
308-
// timeline, but we're not there yet. In the meanwhile, clear the
309-
// items from the room. TODO: implement Smart Matching™.
310-
trace!("limited timeline, clearing all previous events and pushing new events");
311-
312-
self.replace_all_events_by(
313-
timeline.events,
314-
timeline.prev_batch,
315-
ephemeral_events,
316-
ambiguity_changes,
317-
)
318-
.await?;
319-
} else {
320-
// Add all the events to the backend.
321-
trace!("adding new events");
322-
323-
// Only keep the previous-batch token if we have a limited timeline; otherwise,
324-
// we know about all the events, and we don't need to back-paginate,
325-
// so we wouldn't make use of the given previous-batch token.
326-
let prev_batch = if timeline.limited { timeline.prev_batch } else { None };
327-
328-
let mut state = self.state.write().await;
329-
self.append_events_locked(
330-
&mut state,
331-
timeline.events,
332-
prev_batch,
333-
ephemeral_events,
334-
ambiguity_changes,
335-
)
336-
.await?;
337-
}
338-
339-
Ok(())
340-
}
300+
// Add all the events to the backend.
301+
trace!("adding new events");
341302

342-
pub(super) async fn handle_left_room_update(
343-
&self,
344-
has_storage: bool,
345-
updates: LeftRoomUpdate,
346-
) -> Result<()> {
347-
self.handle_timeline(has_storage, updates.timeline, Vec::new(), updates.ambiguity_changes)
348-
.await?;
349-
Ok(())
350-
}
303+
// Only keep the previous-batch token if we have a limited timeline; otherwise,
304+
// we know about all the events, and we don't need to back-paginate,
305+
// so we wouldn't make use of the given previous-batch token.
306+
let prev_batch = if timeline.limited { timeline.prev_batch } else { None };
351307

352-
/// Remove existing events, and append a set of events to the room cache and
353-
/// storage, notifying observers.
354-
pub(super) async fn replace_all_events_by(
355-
&self,
356-
sync_timeline_events: Vec<SyncTimelineEvent>,
357-
prev_batch: Option<String>,
358-
ephemeral_events: Vec<Raw<AnySyncEphemeralRoomEvent>>,
359-
ambiguity_changes: BTreeMap<OwnedEventId, AmbiguityChange>,
360-
) -> Result<()> {
361-
// Acquire the lock.
362308
let mut state = self.state.write().await;
363-
364-
// Reset the room's state.
365-
state.reset().await?;
366-
367-
// Propagate to observers.
368-
let _ = self.sender.send(RoomEventCacheUpdate::Clear);
369-
370-
// Push the new events.
371309
self.append_events_locked(
372310
&mut state,
373-
sync_timeline_events,
374-
prev_batch.clone(),
311+
timeline.events,
312+
prev_batch,
375313
ephemeral_events,
376314
ambiguity_changes,
377315
)
378316
.await?;
379317

380-
// Reset the paginator status to initial.
381-
self.paginator.set_idle_state(PaginatorState::Initial, prev_batch, None)?;
318+
Ok(())
319+
}
382320

321+
pub(super) async fn handle_left_room_update(&self, updates: LeftRoomUpdate) -> Result<()> {
322+
self.handle_timeline(updates.timeline, Vec::new(), updates.ambiguity_changes).await?;
383323
Ok(())
384324
}
385325

@@ -1092,7 +1032,6 @@ mod tests {
10921032

10931033
// Don't forget to subscribe and like^W enable storage!
10941034
event_cache.subscribe().unwrap();
1095-
event_cache.enable_storage().unwrap();
10961035

10971036
client.base_client().get_or_create_room(room_id, matrix_sdk_base::RoomState::Joined);
10981037
let room = client.get_room(room_id).unwrap();
@@ -1108,7 +1047,7 @@ mod tests {
11081047

11091048
room_event_cache
11101049
.inner
1111-
.handle_joined_room_update(true, JoinedRoomUpdate { timeline, ..Default::default() })
1050+
.handle_joined_room_update(JoinedRoomUpdate { timeline, ..Default::default() })
11121051
.await
11131052
.unwrap();
11141053

@@ -1164,7 +1103,6 @@ mod tests {
11641103

11651104
// Don't forget to subscribe and like^W enable storage!
11661105
event_cache.subscribe().unwrap();
1167-
event_cache.enable_storage().unwrap();
11681106

11691107
client.base_client().get_or_create_room(room_id, matrix_sdk_base::RoomState::Joined);
11701108
let room = client.get_room(room_id).unwrap();
@@ -1181,7 +1119,7 @@ mod tests {
11811119

11821120
room_event_cache
11831121
.inner
1184-
.handle_joined_room_update(true, JoinedRoomUpdate { timeline, ..Default::default() })
1122+
.handle_joined_room_update(JoinedRoomUpdate { timeline, ..Default::default() })
11851123
.await
11861124
.unwrap();
11871125

@@ -1297,7 +1235,6 @@ mod tests {
12971235

12981236
// Don't forget to subscribe and like^W enable storage!
12991237
event_cache.subscribe().unwrap();
1300-
event_cache.enable_storage().unwrap();
13011238

13021239
client.base_client().get_or_create_room(room_id, matrix_sdk_base::RoomState::Joined);
13031240
let room = client.get_room(room_id).unwrap();
@@ -1408,7 +1345,6 @@ mod tests {
14081345

14091346
// Don't forget to subscribe and like^W enable storage!
14101347
event_cache.subscribe().unwrap();
1411-
event_cache.enable_storage().unwrap();
14121348

14131349
client.base_client().get_or_create_room(room_id, matrix_sdk_base::RoomState::Joined);
14141350
let room = client.get_room(room_id).unwrap();
@@ -1426,7 +1362,7 @@ mod tests {
14261362
let timeline = Timeline { limited: false, prev_batch: None, events: vec![ev2] };
14271363
room_event_cache
14281364
.inner
1429-
.handle_joined_room_update(true, JoinedRoomUpdate { timeline, ..Default::default() })
1365+
.handle_joined_room_update(JoinedRoomUpdate { timeline, ..Default::default() })
14301366
.await
14311367
.unwrap();
14321368

@@ -1477,7 +1413,6 @@ mod tests {
14771413

14781414
// Don't forget to subscribe and like^W enable storage!
14791415
event_cache.subscribe().unwrap();
1480-
event_cache.enable_storage().unwrap();
14811416

14821417
client.base_client().get_or_create_room(room_id, matrix_sdk_base::RoomState::Joined);
14831418
let room = client.get_room(room_id).unwrap();
@@ -1506,9 +1441,6 @@ mod tests {
15061441
let event_cache = client.event_cache();
15071442
event_cache.subscribe().unwrap();
15081443

1509-
let has_storage = true; // for testing purposes only
1510-
event_cache.enable_storage().unwrap();
1511-
15121444
client.base_client().get_or_create_room(room_id, matrix_sdk_base::RoomState::Joined);
15131445
let room = client.get_room(room_id).unwrap();
15141446
let (room_event_cache, _drop_handles) = room.event_cache().await.unwrap();
@@ -1519,17 +1451,14 @@ mod tests {
15191451
// prev-batch token.
15201452
room_event_cache
15211453
.inner
1522-
.handle_joined_room_update(
1523-
has_storage,
1524-
JoinedRoomUpdate {
1525-
timeline: Timeline {
1526-
limited: true,
1527-
prev_batch: Some("raclette".to_owned()),
1528-
events: vec![f.text_msg("hey yo").into_sync()],
1529-
},
1530-
..Default::default()
1454+
.handle_joined_room_update(JoinedRoomUpdate {
1455+
timeline: Timeline {
1456+
limited: true,
1457+
prev_batch: Some("raclette".to_owned()),
1458+
events: vec![f.text_msg("hey yo").into_sync()],
15311459
},
1532-
)
1460+
..Default::default()
1461+
})
15331462
.await
15341463
.unwrap();
15351464

@@ -1555,17 +1484,14 @@ mod tests {
15551484
// this time.
15561485
room_event_cache
15571486
.inner
1558-
.handle_joined_room_update(
1559-
has_storage,
1560-
JoinedRoomUpdate {
1561-
timeline: Timeline {
1562-
limited: false,
1563-
prev_batch: Some("fondue".to_owned()),
1564-
events: vec![f.text_msg("sup").into_sync()],
1565-
},
1566-
..Default::default()
1487+
.handle_joined_room_update(JoinedRoomUpdate {
1488+
timeline: Timeline {
1489+
limited: false,
1490+
prev_batch: Some("fondue".to_owned()),
1491+
events: vec![f.text_msg("sup").into_sync()],
15671492
},
1568-
)
1493+
..Default::default()
1494+
})
15691495
.await
15701496
.unwrap();
15711497

0 commit comments

Comments
 (0)