From 252f4cb9a293f7ea1ebdd715ef5f35c412f7a88a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Commaille?= Date: Tue, 25 Apr 2023 17:15:43 +0200 Subject: [PATCH] sled: Store memberships as strings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Storing as bitset is not future-proof. Signed-off-by: Kévin Commaille --- .../src/state_store/migrations.rs | 18 ++++++++++------ crates/matrix-sdk-sled/src/state_store/mod.rs | 21 +++++++------------ 2 files changed, 19 insertions(+), 20 deletions(-) diff --git a/crates/matrix-sdk-sled/src/state_store/migrations.rs b/crates/matrix-sdk-sled/src/state_store/migrations.rs index 7e11f56f1..e9a99e485 100644 --- a/crates/matrix-sdk-sled/src/state_store/migrations.rs +++ b/crates/matrix-sdk-sled/src/state_store/migrations.rs @@ -30,7 +30,7 @@ use tracing::debug; use super::{keys, Result, RoomMember, SledStateStore, SledStoreError}; use crate::encode_key::EncodeKey; -const DATABASE_VERSION: u8 = 6; +const DATABASE_VERSION: u8 = 7; const VERSION_KEY: &str = "state-store-version"; @@ -87,8 +87,10 @@ impl SledStateStore { return Ok(()); } - if old_version < 6 { - self.migrate_to_v6()?; + // Version 6 was dropped and migration is similar to v7. + + if old_version < 7 { + self.migrate_to_v7()?; return Ok(()); } @@ -277,8 +279,12 @@ impl SledStateStore { } /// Remove the old user IDs stores and populate the new ones. - fn migrate_to_v6(&self) -> Result<()> { + fn migrate_to_v7(&self) -> Result<()> { { + // Reset v6 stores. + self.user_ids.clear()?; + self.stripped_user_ids.clear()?; + // We only have joined and invited user IDs in the old stores, so instead we // use the room member events to populate the new stores. let state = &self.inner.open_tree(keys::ROOM_STATE)?; @@ -345,7 +351,7 @@ impl SledStateStore { self.inner.drop_tree(old_keys::STRIPPED_JOINED_USER_ID)?; self.inner.drop_tree(old_keys::STRIPPED_INVITED_USER_ID)?; - self.set_db_version(6) + self.set_db_version(7) } } @@ -697,7 +703,7 @@ mod test { } #[async_test] - pub async fn migrating_v5_to_v6() { + pub async fn migrating_v5_to_v7() { let room_id = room_id!("!room:localhost"); let invite_member_event = Raw::new(&*test_json::MEMBER_INVITE).unwrap().cast::(); diff --git a/crates/matrix-sdk-sled/src/state_store/mod.rs b/crates/matrix-sdk-sled/src/state_store/mod.rs index e315ba568..8cb72ee5c 100644 --- a/crates/matrix-sdk-sled/src/state_store/mod.rs +++ b/crates/matrix-sdk-sled/src/state_store/mod.rs @@ -34,7 +34,9 @@ use ruma::{ events::{ presence::PresenceEvent, receipt::{Receipt, ReceiptThread, ReceiptType}, - room::member::{RoomMemberEventContent, StrippedRoomMemberEvent, SyncRoomMemberEvent}, + room::member::{ + MembershipState, RoomMemberEventContent, StrippedRoomMemberEvent, SyncRoomMemberEvent, + }, AnyGlobalAccountDataEvent, AnyRoomAccountDataEvent, AnySyncStateEvent, GlobalAccountDataEventType, RoomAccountDataEventType, StateEventType, SyncStateEvent, }, @@ -873,10 +875,7 @@ impl SledStateStore { .deserialize_value::(&u.map_err(StoreError::backend)?.1) .map_err(StoreError::backend)?; - Ok((memberships.is_empty() - || memberships - .contains(RoomMemberships::from_bits_retain(member.membership))) - .then_some(member.user_id)) + Ok(memberships.matches(&member.membership).then_some(member.user_id)) }) .filter_map(|u| u.transpose()) .collect::>>() @@ -1381,24 +1380,18 @@ impl StateStore for SledStateStore { #[derive(Debug, Serialize, Deserialize)] struct RoomMember { user_id: OwnedUserId, - membership: u16, + membership: MembershipState, } impl From<&SyncStateEvent> for RoomMember { fn from(event: &SyncStateEvent) -> Self { - Self { - user_id: event.state_key().clone(), - membership: RoomMemberships::from(event.membership()).bits(), - } + Self { user_id: event.state_key().clone(), membership: event.membership().clone() } } } impl From<&StrippedRoomMemberEvent> for RoomMember { fn from(event: &StrippedRoomMemberEvent) -> Self { - Self { - user_id: event.state_key.clone(), - membership: RoomMemberships::from(&event.content.membership).bits(), - } + Self { user_id: event.state_key.clone(), membership: event.content.membership.clone() } } }