From d2cc2fb19bc8ec79434c72c0fa4fa3254e60d81d Mon Sep 17 00:00:00 2001 From: Ginger Date: Thu, 6 Nov 2025 10:02:02 -0500 Subject: [PATCH] fix(sync/v3): Stop ignoring leave cache deserialization failures --- src/api/client/membership/leave.rs | 2 +- src/service/rooms/state_cache/mod.rs | 20 ++++---------------- 2 files changed, 5 insertions(+), 17 deletions(-) diff --git a/src/api/client/membership/leave.rs b/src/api/client/membership/leave.rs index b439182c..a1d82668 100644 --- a/src/api/client/membership/leave.rs +++ b/src/api/client/membership/leave.rs @@ -177,7 +177,7 @@ pub async fn leave_room( .rooms .state_cache .left_state(user_id, room_id) - .await + .await? }, } }; diff --git a/src/service/rooms/state_cache/mod.rs b/src/service/rooms/state_cache/mod.rs index eaf1aeae..b87dfbe9 100644 --- a/src/service/rooms/state_cache/mod.rs +++ b/src/service/rooms/state_cache/mod.rs @@ -430,16 +430,9 @@ pub async fn knock_state( #[implement(Service)] #[tracing::instrument(skip(self), level = "trace")] -pub async fn left_state(&self, user_id: &UserId, room_id: &RoomId) -> Option { +pub async fn left_state(&self, user_id: &UserId, room_id: &RoomId) -> Result> { let key = (user_id, room_id); - self.db - .userroomid_leftstate - .qry(&key) - .await - .deserialized() - // old databases may have garbage data as values in the `userroomid_leftstate` table from before - // the leave event was stored there. they still need to be included, so we return Ok(None) for deserialization failures. - .unwrap_or(None) + self.db.userroomid_leftstate.qry(&key).await.deserialized() } /// Returns an iterator over all rooms a user left. @@ -458,13 +451,8 @@ pub fn rooms_left<'a>( .stream_prefix(&prefix) .ignore_err() .map(|((_, room_id), state): KeyVal<'_>| (room_id.to_owned(), state)) - .ready_filter_map(|(room_id, state)| { - // deserialization errors need to be ignored. see comment in `left_state` - match state.deserialize() { - | Ok(state) => Some((room_id, state)), - | Err(_) => Some((room_id, None)), - } - }) + .map(|(room_id, state)| Ok((room_id, state.deserialize()?))) + .ignore_err() } #[implement(Service)]