diff --git a/crates/matrix-sdk/src/sliding_sync/cache.rs b/crates/matrix-sdk/src/sliding_sync/cache.rs index 72fd5c4b9..4de9d6221 100644 --- a/crates/matrix-sdk/src/sliding_sync/cache.rs +++ b/crates/matrix-sdk/src/sliding_sync/cache.rs @@ -12,6 +12,8 @@ use tracing::{trace, warn}; use super::{FrozenSlidingSyncList, SlidingSync, SlidingSyncPositionMarkers}; #[cfg(feature = "e2e-encryption")] use crate::sliding_sync::FrozenSlidingSyncPos; +#[cfg(doc)] +use crate::sliding_sync::SlidingSyncList; use crate::{sliding_sync::SlidingSyncListCachePolicy, Client, Result}; /// Be careful: as this is used as a storage key; changing it requires migrating @@ -142,7 +144,7 @@ pub(super) async fn restore_sliding_sync_list( Ok(None) } -/// Fields restored during `restore_sliding_sync_state`. +/// Fields restored during [`restore_sliding_sync_state`]. #[derive(Default)] pub(super) struct RestoredFields { pub to_device_token: Option, diff --git a/crates/matrix-sdk/src/sliding_sync/list/mod.rs b/crates/matrix-sdk/src/sliding_sync/list/mod.rs index f51bb2506..5f8e2df9e 100644 --- a/crates/matrix-sdk/src/sliding_sync/list/mod.rs +++ b/crates/matrix-sdk/src/sliding_sync/list/mod.rs @@ -211,7 +211,6 @@ impl SlidingSyncList { } /// Set the maximum number of rooms. - #[cfg(test)] pub(super) fn set_maximum_number_of_rooms(&self, maximum_number_of_rooms: Option) { self.inner.maximum_number_of_rooms.set(maximum_number_of_rooms); } diff --git a/crates/matrix-sdk/src/sliding_sync/mod.rs b/crates/matrix-sdk/src/sliding_sync/mod.rs index 62958d0e0..09efd26a9 100644 --- a/crates/matrix-sdk/src/sliding_sync/mod.rs +++ b/crates/matrix-sdk/src/sliding_sync/mod.rs @@ -725,14 +725,29 @@ impl SlidingSync { pub async fn expire_session(&self) { info!("Session expired; resetting `pos` and sticky parameters"); + { + let lists = self.inner.lists.read().await; + for list in lists.values() { + // Invalidate in-memory data that would be persisted on disk. + list.set_maximum_number_of_rooms(None); + + // Invalidate the sticky data for this list. + list.invalidate_sticky_data(); + } + } + + // Remove the cached sliding sync state as well. { let mut position = self.inner.position.lock().await; + + // Invalidate in memory. position.pos = None; + // Propagate to disk. + // Note: this propagates both the sliding sync state and the cached lists' + // state to disk. if let Err(err) = self.cache_to_storage(&position).await { - error!( - "couldn't invalidate sliding sync frozen state when expiring session: {err}" - ); + warn!("Failed to invalidate cached sliding sync state: {err}"); } } @@ -743,8 +758,6 @@ impl SlidingSync { // when the session will restart. sticky.data_mut().room_subscriptions.clear(); } - - self.inner.lists.read().await.values().for_each(|list| list.invalidate_sticky_data()); } }