diff --git a/src/admin/debug/commands.rs b/src/admin/debug/commands.rs index 9fc69aae9..9abdaac59 100644 --- a/src/admin/debug/commands.rs +++ b/src/admin/debug/commands.rs @@ -849,6 +849,7 @@ impl crate::Context<'_> { get_room_state::v1::Request::new(at_event_id, room_id.clone()), ) .await?; + let _state_lock = self.services.rooms.state.mutex.lock(&*room_id).await; for pdu in remote_state_response.pdus.clone() { match self @@ -944,13 +945,11 @@ impl crate::Context<'_> { .save_state(room_id.clone().as_ref(), new_room_state) .await?; - let state_lock = self.services.rooms.state.mutex.lock(&*room_id).await; - info!("Forcing new room state"); self.services .rooms .state - .force_state(room_id.clone().as_ref(), short_state_hash, added, removed, &state_lock) + .force_state(room_id.clone().as_ref(), short_state_hash, added, removed) .await?; info!("Updating joined counts for room"); diff --git a/src/admin/user/commands.rs b/src/admin/user/commands.rs index fbde37570..475976342 100644 --- a/src/admin/user/commands.rs +++ b/src/admin/user/commands.rs @@ -773,7 +773,7 @@ impl crate::Context<'_> { ), &user_id, Some(&room_id), - &state_lock, + Some(&state_lock), ) .await?; @@ -911,14 +911,6 @@ impl crate::Context<'_> { ); let redaction_event_id = { - let state_lock = self - .services - .rooms - .state - .mutex - .lock(event.room_id_or_hash().as_str()) - .await; - self.services .rooms .timeline @@ -932,7 +924,7 @@ impl crate::Context<'_> { }, event.sender(), Some(&event.room_id_or_hash()), - &state_lock, + None, ) .await? }; diff --git a/src/api/client/account/mod.rs b/src/api/client/account/mod.rs index 6a5dcba8b..4945266f6 100644 --- a/src/api/client/account/mod.rs +++ b/src/api/client/account/mod.rs @@ -383,7 +383,7 @@ pub async fn full_user_deactivate( let _ = services .rooms .timeline - .build_and_append_pdu(pdu, user_id, Some(room_id.as_ref()), &state_lock) + .build_and_append_pdu(pdu, user_id, Some(room_id.as_ref()), Some(&state_lock)) .await; } diff --git a/src/api/client/membership/ban.rs b/src/api/client/membership/ban.rs index 77e0c9c4e..214c95c27 100644 --- a/src/api/client/membership/ban.rs +++ b/src/api/client/membership/ban.rs @@ -40,7 +40,7 @@ pub(crate) async fn ban_user_route( ), sender_user, Some(&body.room_id), - &state_lock, + Some(&state_lock), ) .await?; diff --git a/src/api/client/membership/invite.rs b/src/api/client/membership/invite.rs index fbe210224..7356635f2 100644 --- a/src/api/client/membership/invite.rs +++ b/src/api/client/membership/invite.rs @@ -177,7 +177,7 @@ async fn send_invite( PartialPdu::state(recipient_user.to_string(), &content), sender_user, Some(room_id), - &state_lock, + Some(&state_lock), ) .await?; @@ -276,7 +276,7 @@ async fn send_invite( PartialPdu::state(recipient_user.to_string(), &content), sender_user, Some(room_id), - &state_lock, + Some(&state_lock), ) .await?; diff --git a/src/api/client/membership/kick.rs b/src/api/client/membership/kick.rs index 33f73f560..28cdf6a7c 100644 --- a/src/api/client/membership/kick.rs +++ b/src/api/client/membership/kick.rs @@ -48,7 +48,7 @@ pub(crate) async fn kick_user_route( ), sender_user, Some(&body.room_id), - &state_lock, + Some(&state_lock), ) .await?; diff --git a/src/api/client/membership/knock.rs b/src/api/client/membership/knock.rs index f24ede158..632b9483b 100644 --- a/src/api/client/membership/knock.rs +++ b/src/api/client/membership/knock.rs @@ -266,16 +266,9 @@ async fn knock_room_by_id_helper( .boxed() .await?; } else { - knock_room_helper_remote( - services, - sender_user, - room_id, - reason, - servers, - new_state_lock, - ) - .boxed() - .await?; + knock_room_helper_remote(services, sender_user, room_id, reason, servers) + .boxed() + .await?; } return Ok(knock_room::v3::Response::new(room_id.to_owned())); @@ -304,7 +297,7 @@ async fn knock_room_by_id_helper( .boxed() .await?; } else { - knock_room_helper_remote(services, sender_user, room_id, reason, servers, state_lock) + knock_room_helper_remote(services, sender_user, room_id, reason, servers) .boxed() .await?; } @@ -344,7 +337,7 @@ async fn knock_room_helper_local( PartialPdu::state(sender_user.to_string(), &content), sender_user, Some(room_id), - &state_lock, + Some(&state_lock), ) .await else { @@ -479,7 +472,6 @@ async fn knock_room_helper_remote( room_id: &RoomId, reason: Option, servers: &[OwnedServerName], - state_lock: RoomMutexGuard, ) -> Result { info!("Knocking {room_id} over federation."); @@ -641,7 +633,7 @@ async fn knock_room_helper_remote( services .rooms .state - .force_state(room_id, statehash_before_knock, added, removed, &state_lock) + .force_state(room_id, statehash_before_knock, added, removed) .await?; let statehash_after_knock = services @@ -677,7 +669,7 @@ async fn knock_room_helper_remote( services .rooms .state - .set_room_state(room_id, statehash_after_knock, &state_lock); + .set_room_state(room_id, statehash_after_knock); Ok(()) } diff --git a/src/api/client/membership/leave.rs b/src/api/client/membership/leave.rs index 1ef0b21fa..e6d636aa5 100644 --- a/src/api/client/membership/leave.rs +++ b/src/api/client/membership/leave.rs @@ -155,7 +155,7 @@ pub async fn leave_room( PartialPdu::state(user_id.to_string(), &content), user_id, Some(room_id), - &state_lock, + Some(&state_lock), ) .await?; diff --git a/src/api/client/membership/unban.rs b/src/api/client/membership/unban.rs index 13b41ee00..d9ace969f 100644 --- a/src/api/client/membership/unban.rs +++ b/src/api/client/membership/unban.rs @@ -47,7 +47,7 @@ pub(crate) async fn unban_user_route( PartialPdu::state(body.user_id.to_string(), ¤t_member_content), sender_user, Some(&body.room_id), - &state_lock, + Some(&state_lock), ) .await?; diff --git a/src/api/client/redact.rs b/src/api/client/redact.rs index 540e3c0a6..2fc87fe99 100644 --- a/src/api/client/redact.rs +++ b/src/api/client/redact.rs @@ -27,8 +27,6 @@ pub(crate) async fn redact_event_route( return Err!(Request(UserSuspended("You cannot perform this action while suspended."))); } - let state_lock = services.rooms.state.mutex.lock(body.room_id.as_str()).await; - let event_id = services .rooms .timeline @@ -43,11 +41,9 @@ pub(crate) async fn redact_event_route( }, sender_user, Some(&body.room_id), - &state_lock, + None, ) .await?; - drop(state_lock); - Ok(redact_event::v3::Response::new(event_id)) } diff --git a/src/api/client/room/create.rs b/src/api/client/room/create.rs index 582169346..dac3514d4 100644 --- a/src/api/client/room/create.rs +++ b/src/api/client/room/create.rs @@ -327,7 +327,7 @@ pub(crate) async fn create_room_route( }, sender_user, tmp_id, - &state_lock, + Some(&state_lock), ) .boxed() .await?; @@ -367,7 +367,7 @@ pub(crate) async fn create_room_route( PartialPdu::state(sender_user.to_string(), &join_event), sender_user, Some(&room_id), - &state_lock, + Some(&state_lock), ) .boxed() .await?; @@ -409,7 +409,7 @@ pub(crate) async fn create_room_route( }, sender_user, Some(&room_id), - &state_lock, + Some(&state_lock), ) .boxed() .await?; @@ -429,7 +429,7 @@ pub(crate) async fn create_room_route( ), sender_user, Some(&room_id), - &state_lock, + Some(&state_lock), ) .boxed() .await?; @@ -452,7 +452,7 @@ pub(crate) async fn create_room_route( ), sender_user, Some(&room_id), - &state_lock, + Some(&state_lock), ) .boxed() .await?; @@ -468,7 +468,7 @@ pub(crate) async fn create_room_route( ), sender_user, Some(&room_id), - &state_lock, + Some(&state_lock), ) .boxed() .await?; @@ -487,7 +487,7 @@ pub(crate) async fn create_room_route( ), sender_user, Some(&room_id), - &state_lock, + Some(&state_lock), ) .boxed() .await?; @@ -512,7 +512,7 @@ pub(crate) async fn create_room_route( services .rooms .timeline - .build_and_append_pdu(pdu, sender_user, Some(&room_id), &state_lock) + .build_and_append_pdu(pdu, sender_user, Some(&room_id), Some(&state_lock)) .boxed() .await?; } @@ -567,7 +567,7 @@ pub(crate) async fn create_room_route( PartialPdu::state(String::new(), &RoomNameEventContent::new(name.clone())), sender_user, Some(&room_id), - &state_lock, + Some(&state_lock), ) .boxed() .await?; @@ -581,7 +581,7 @@ pub(crate) async fn create_room_route( PartialPdu::state(String::new(), &RoomTopicEventContent::new(topic.clone())), sender_user, Some(&room_id), - &state_lock, + Some(&state_lock), ) .boxed() .await?; diff --git a/src/api/client/room/upgrade.rs b/src/api/client/room/upgrade.rs index 1d4a623f1..75f9935bf 100644 --- a/src/api/client/room/upgrade.rs +++ b/src/api/client/room/upgrade.rs @@ -123,7 +123,7 @@ async fn update_parents( ), sender, Some(&parent_id), - &state_lock, + Some(&state_lock), ) .boxed() .await @@ -218,7 +218,7 @@ async fn update_children( ), sender, Some(&child_id), - &state_lock, + Some(&state_lock), ) .boxed() .await @@ -246,7 +246,7 @@ async fn update_children( ), sender, Some(&child_id), - &state_lock, + Some(&state_lock), ) .boxed() .await @@ -324,7 +324,7 @@ pub(crate) async fn upgrade_room_route( ), sender_user, Some(&body.room_id), - &old_room_state_lock, + Some(&old_room_state_lock), ) .await .map_err(|_| { @@ -407,7 +407,7 @@ pub(crate) async fn upgrade_room_route( PartialPdu::state(StateKey::new(), &create_event_content), sender_user, replacement_room_id.as_deref(), - &new_room_state_lock, + Some(&new_room_state_lock), ) .boxed() .await?; @@ -453,7 +453,7 @@ pub(crate) async fn upgrade_room_route( ), sender_user, replacement_room_id.as_deref(), - &new_room_state_lock, + Some(&new_room_state_lock), ) .boxed() .await?; @@ -527,7 +527,7 @@ pub(crate) async fn upgrade_room_route( }, sender_user, replacement_room_id.as_deref(), - &new_room_state_lock, + Some(&new_room_state_lock), ) .boxed() .await?; @@ -572,7 +572,7 @@ pub(crate) async fn upgrade_room_route( ), sender_user, Some(&body.room_id), - &old_room_state_lock, + Some(&old_room_state_lock), ) .await?; @@ -613,7 +613,7 @@ pub(crate) async fn upgrade_room_route( ), sender_user, Some(&body.room_id), - &old_room_state_lock, + Some(&old_room_state_lock), ) .boxed() .await diff --git a/src/api/client/send.rs b/src/api/client/send.rs index b87f7eb2e..779ecf5b2 100644 --- a/src/api/client/send.rs +++ b/src/api/client/send.rs @@ -46,8 +46,6 @@ pub(crate) async fn send_message_event_route( return Err!(Request(Forbidden("Encryption has been disabled"))); } - let state_lock = services.rooms.state.mutex.lock(body.room_id.as_str()).await; - if body.event_type == MessageLikeEventType::CallInvite && services.rooms.directory.is_public_room(&body.room_id).await { @@ -114,7 +112,7 @@ pub(crate) async fn send_message_event_route( }, sender_user, Some(&body.room_id), - &state_lock, + None, ) .await?; @@ -125,8 +123,6 @@ pub(crate) async fn send_message_event_route( event_id.as_bytes(), ); - drop(state_lock); - Ok(send_message_event::v3::Response::new(event_id)) } diff --git a/src/api/server/make_join.rs b/src/api/server/make_join.rs index dcb74d433..79e1d4b0c 100644 --- a/src/api/server/make_join.rs +++ b/src/api/server/make_join.rs @@ -151,7 +151,7 @@ pub(crate) async fn create_join_event_template_route( ), &body.user_id, Some(&body.room_id), - &state_lock, + Some(&state_lock), ) .await?; drop(state_lock); diff --git a/src/api/server/make_knock.rs b/src/api/server/make_knock.rs index 4c918daa8..d3ef4a809 100644 --- a/src/api/server/make_knock.rs +++ b/src/api/server/make_knock.rs @@ -107,7 +107,7 @@ pub(crate) async fn create_knock_event_template_route( ), &body.user_id, Some(&body.room_id), - &state_lock, + Some(&state_lock), ) .await?; diff --git a/src/api/server/make_leave.rs b/src/api/server/make_leave.rs index 1a472aa69..8a308df4f 100644 --- a/src/api/server/make_leave.rs +++ b/src/api/server/make_leave.rs @@ -59,7 +59,7 @@ pub(crate) async fn create_leave_event_template_route( ), &body.user_id, Some(&body.room_id), - &state_lock, + Some(&state_lock), ) .await?; diff --git a/src/service/admin/create.rs b/src/service/admin/create.rs index 2febccaa4..f93f7a99c 100644 --- a/src/service/admin/create.rs +++ b/src/service/admin/create.rs @@ -75,7 +75,7 @@ pub async fn create_admin_room(services: &Services) -> Result { PartialPdu::state(String::new(), &create_content), server_user, room_id.as_deref(), - &state_lock, + Some(&state_lock), ) .boxed() .await?; @@ -100,7 +100,7 @@ pub async fn create_admin_room(services: &Services) -> Result { ), server_user, Some(&room_id), - &state_lock, + Some(&state_lock), ) .boxed() .await?; @@ -135,7 +135,7 @@ pub async fn create_admin_room(services: &Services) -> Result { PartialPdu::state(String::new(), &power_levels_content), server_user, Some(&room_id), - &state_lock, + Some(&state_lock), ) .boxed() .await?; @@ -148,7 +148,7 @@ pub async fn create_admin_room(services: &Services) -> Result { PartialPdu::state(String::new(), &RoomJoinRulesEventContent::new(JoinRule::Invite)), server_user, Some(&room_id), - &state_lock, + Some(&state_lock), ) .boxed() .await?; @@ -164,7 +164,7 @@ pub async fn create_admin_room(services: &Services) -> Result { ), server_user, Some(&room_id), - &state_lock, + Some(&state_lock), ) .boxed() .await?; @@ -180,7 +180,7 @@ pub async fn create_admin_room(services: &Services) -> Result { ), server_user, Some(&room_id), - &state_lock, + Some(&state_lock), ) .boxed() .await?; @@ -194,7 +194,7 @@ pub async fn create_admin_room(services: &Services) -> Result { PartialPdu::state(String::new(), &RoomNameEventContent::new(room_name)), server_user, Some(&room_id), - &state_lock, + Some(&state_lock), ) .boxed() .await?; @@ -207,7 +207,7 @@ pub async fn create_admin_room(services: &Services) -> Result { PartialPdu::state(String::new(), &RoomTopicEventContent::markdown(room_topic)), server_user, Some(&room_id), - &state_lock, + Some(&state_lock), ) .boxed() .await?; @@ -223,7 +223,7 @@ pub async fn create_admin_room(services: &Services) -> Result { PartialPdu::state(String::new(), &alias_content), server_user, Some(&room_id), - &state_lock, + Some(&state_lock), ) .boxed() .await?; diff --git a/src/service/admin/grant.rs b/src/service/admin/grant.rs index 47cd227b9..8203d0167 100644 --- a/src/service/admin/grant.rs +++ b/src/service/admin/grant.rs @@ -56,7 +56,7 @@ impl super::Service { ), server_user, Some(&room_id), - &state_lock, + Some(&state_lock), ) .await?; @@ -70,7 +70,7 @@ impl super::Service { ), user_id, Some(&room_id), - &state_lock, + Some(&state_lock), ) .await?; } else { @@ -84,7 +84,7 @@ impl super::Service { ), server_user, Some(&room_id), - &state_lock, + Some(&state_lock), ) .await?; } @@ -116,7 +116,7 @@ impl super::Service { PartialPdu::state(String::new(), &room_power_levels), server_user, Some(&room_id), - &state_lock, + Some(&state_lock), ) .await?; @@ -196,7 +196,7 @@ impl super::Service { PartialPdu::state(String::new(), &room_power_levels), self.services.globals.server_user.as_ref(), Some(&room_id), - &state_lock, + Some(&state_lock), ) .await .inspect_err(|e| { @@ -243,7 +243,7 @@ impl super::Service { PartialPdu::state(user_id.to_string(), &member_content), self.services.globals.server_user.as_ref(), Some(&room_id), - &state_lock, + Some(&state_lock), ) .await .map(|_| ()) diff --git a/src/service/admin/mod.rs b/src/service/admin/mod.rs index 15dc33d50..8b03963f1 100644 --- a/src/service/admin/mod.rs +++ b/src/service/admin/mod.rs @@ -32,7 +32,7 @@ use tokio::sync::RwLock; use crate::{ Dep, account_data, config, globals, media::{MXC_LENGTH, mxc::Mxc}, - rooms::{self, state::RoomMutexGuard}, + rooms, }; pub struct Service { @@ -492,7 +492,6 @@ impl Service { ) -> Result<()> { assert!(self.user_is_admin(user_id).await, "sender is not admin"); - let state_lock = self.services.state.mutex.lock(room_id).await; if let Err(e) = self .services .timeline @@ -500,11 +499,11 @@ impl Service { PartialPdu::timeline(&self.text_or_file(content).await), user_id, Some(room_id), - &state_lock, + None, ) .await { - self.handle_response_error(e, room_id, user_id, &state_lock) + self.handle_response_error(e, room_id, user_id) .boxed() .await .unwrap_or_else(default_log); @@ -518,7 +517,6 @@ impl Service { e: Error, room_id: &RoomId, user_id: &UserId, - state_lock: &RoomMutexGuard, ) -> Result<()> { error!("Failed to build and append admin room response PDU: \"{e}\""); let content = RoomMessageEventContent::text_plain(format!( @@ -528,12 +526,7 @@ impl Service { self.services .timeline - .build_and_append_pdu( - PartialPdu::timeline(&content), - user_id, - Some(room_id), - state_lock, - ) + .build_and_append_pdu(PartialPdu::timeline(&content), user_id, Some(room_id), None) .await?; Ok(()) diff --git a/src/service/rooms/event_handler/handle_incoming_pdu.rs b/src/service/rooms/event_handler/handle_incoming_pdu.rs index ff2099b84..51d08dd7e 100644 --- a/src/service/rooms/event_handler/handle_incoming_pdu.rs +++ b/src/service/rooms/event_handler/handle_incoming_pdu.rs @@ -325,7 +325,6 @@ impl super::Service { trace!(%user_id, "user does not have power level to send dummy event, skipping"); continue; } - let state_lock = self.services.state.mutex.lock(room_id).await; if self .services .timeline @@ -336,7 +335,7 @@ impl super::Service { }, &user_id, Some(room_id), - &state_lock, + None, ) .await .inspect(|_| debug!(sender=%user_id, "Successfully sent a dummy event")) diff --git a/src/service/rooms/event_handler/upgrade_outlier_pdu.rs b/src/service/rooms/event_handler/upgrade_outlier_pdu.rs index af3d5b7de..b5b560459 100644 --- a/src/service/rooms/event_handler/upgrade_outlier_pdu.rs +++ b/src/service/rooms/event_handler/upgrade_outlier_pdu.rs @@ -60,6 +60,14 @@ impl super::Service { let timer = Instant::now(); let min_depth = self.services.metadata.get_mindepth(room_id).await; let room_version_rules = get_room_version_rules(create_event)?; + // We lock the room here to prevent the current state from changing + // beneath us mid-check. + let state_lock = if incoming_pdu.state_key.is_some() || incoming_pdu.prev_events.len() > 1 + { + Some(self.services.state.mutex.lock(room_id).await) + } else { + None + }; // We now need to resolve the state before the event so that we can // perform PDU check 5 (event auth passes based on state before the @@ -81,14 +89,6 @@ impl super::Service { // that it passes based on the *current* room state (state across all // forward extremities). If it doesn't, we accept it, but soft-fail // it, and this prevents it being promoted. - - // We lock the room here to prevent the current state from changing - // beneath us mid-check. - trace!( - room_id = %room_id, - "Locking the room" - ); - let state_lock = self.services.state.mutex.lock(room_id).await; let passes_current_state = self .current_state_check_6(&incoming_pdu, &room_version_rules, create_event) .await @@ -175,9 +175,9 @@ impl super::Service { &room_version_rules, state_before, should_soft_fail, - &state_lock, ) .await?; + drop(state_lock); if should_soft_fail { debug_info!( @@ -193,7 +193,6 @@ impl super::Service { } // Event has passed all auth/stateres checks - drop(state_lock); if incoming_pdu.depth > min_depth && incoming_pdu.state_key().is_some() { self.services .metadata diff --git a/src/service/rooms/membership/mod.rs b/src/service/rooms/membership/mod.rs index 5445b15ac..e5454fa28 100644 --- a/src/service/rooms/membership/mod.rs +++ b/src/service/rooms/membership/mod.rs @@ -291,7 +291,7 @@ impl Service { PartialPdu::state(sender_user.to_string(), &content), sender_user, Some(room_id), - state_lock, + Some(&state_lock), ) .await?; @@ -664,7 +664,7 @@ impl Service { debug!("Forcing state for new room"); self.services .state - .force_state(room_id, statehash_before_join, added, removed, state_lock) + .force_state(room_id, statehash_before_join, added, removed) .await?; debug!("Updating joined counts for new room"); @@ -701,7 +701,7 @@ impl Service { // exist self.services .state - .set_room_state(room_id, statehash_after_join, state_lock); + .set_room_state(room_id, statehash_after_join); if !resident_before { // NOTE: We replace local extremities for this room if we were not a // resident before. We might be doing a remote join to satisfy diff --git a/src/service/rooms/state/mod.rs b/src/service/rooms/state/mod.rs index 200e03f7f..6f2892182 100644 --- a/src/service/rooms/state/mod.rs +++ b/src/service/rooms/state/mod.rs @@ -102,7 +102,6 @@ impl Service { shortstatehash: u64, statediffnew: Arc, _statediffremoved: Arc, - state_lock: &RoomMutexGuard, ) -> Result { let event_ids = statediffnew .iter() @@ -139,7 +138,7 @@ impl Service { self.services.state_cache.update_joined_count(room_id).await; - self.set_room_state(room_id, shortstatehash, state_lock); + self.set_room_state(room_id, shortstatehash); self.services.sync.wake_all_joined(room_id).await; @@ -363,14 +362,8 @@ impl Service { } /// Set the state hash to a new version, but does not update state_cache. - #[tracing::instrument(skip(self, _mutex_lock), level = "debug")] - pub fn set_room_state( - &self, - room_id: &RoomId, - shortstatehash: u64, - // Take mutex guard to make sure users get the room state mutex - _mutex_lock: &RoomMutexGuard, - ) { + #[tracing::instrument(skip(self), level = "debug")] + pub fn set_room_state(&self, room_id: &RoomId, shortstatehash: u64) { const BUFSIZE: usize = size_of::(); self.db diff --git a/src/service/rooms/state_accessor/user_can.rs b/src/service/rooms/state_accessor/user_can.rs index 4754935ee..be3df28fd 100644 --- a/src/service/rooms/state_accessor/user_can.rs +++ b/src/service/rooms/state_accessor/user_can.rs @@ -146,7 +146,7 @@ impl super::Service { ), sender, Some(room_id), - state_lock, + Some(state_lock), ) .await .is_ok() diff --git a/src/service/rooms/timeline/append.rs b/src/service/rooms/timeline/append.rs index 5f09c4638..332eff352 100644 --- a/src/service/rooms/timeline/append.rs +++ b/src/service/rooms/timeline/append.rs @@ -14,7 +14,6 @@ use conduwuit::{ trace, utils::{ IterStream, TryFutureExtExt, - mutex_map::Guard, stream::{BroadbandExt, ReadyExt}, }, warn, @@ -27,7 +26,7 @@ use conduwuit_core::{ }; use futures::{FutureExt, StreamExt, TryFutureExt, pin_mut}; use ruma::{ - CanonicalJsonObject, CanonicalJsonValue, EventId, OwnedEventId, OwnedRoomId, OwnedServerName, + CanonicalJsonObject, CanonicalJsonValue, EventId, OwnedEventId, OwnedServerName, RoomId, RoomVersionId, ServerName, UserId, events::{ AnySyncTimelineEvent, GlobalAccountDataEventType, TimelineEventType, @@ -43,7 +42,7 @@ use ruma::{ serde::Raw, }; -use super::{ExtractBody, ExtractRelatesTo, ExtractRelatesToEventId, RoomMutexGuard}; +use super::{ExtractBody, ExtractRelatesTo, ExtractRelatesToEventId}; use crate::{ appservice::RegistrationInfo, rooms::state_compressor::{CompressedState, HashSetCompressStateEvent}, @@ -59,7 +58,6 @@ impl super::Service { room_version_rules: &RoomVersionRules, state_before: HashMap, should_soft_fail: bool, - state_lock: &'a RoomMutexGuard, ) -> Result> { let room_id = pdu.room_id_or_hash(); @@ -104,7 +102,6 @@ impl super::Service { .get_forward_extremities(&room_id) .collect() .await, - state_lock, ) .await?; @@ -113,7 +110,6 @@ impl super::Service { pdu, pdu_json, extremities.iter().map(Borrow::borrow), - state_lock, &room_id, ) .await?; @@ -166,11 +162,10 @@ impl super::Service { room_version_rules: &RoomVersionRules, state_before: HashMap, current_extremities: Vec, - state_lock: &Guard, ) -> Result> { if incoming_pdu.state_key().is_some() { debug!("Event is a state-event. Deriving new room state"); - self.derive_new_state(incoming_pdu, room_version_rules, state_before, state_lock) + self.derive_new_state(incoming_pdu, room_version_rules, state_before) .await?; } @@ -269,7 +264,6 @@ impl super::Service { incoming_pdu: &PduEvent, room_version_rules: &RoomVersionRules, state_before: HashMap, - state_lock: &Guard, ) -> Result { let room_id = incoming_pdu.room_id_or_hash(); // We also add state after incoming event to the fork states @@ -302,7 +296,7 @@ impl super::Service { self.services .state - .force_state(&room_id, shortstatehash, added, removed, state_lock) + .force_state(&room_id, shortstatehash, added, removed) .await } @@ -352,7 +346,6 @@ impl super::Service { pdu: &'a PduEvent, mut pdu_json: CanonicalJsonObject, leaves: Leaves, - state_lock: &'a RoomMutexGuard, room_id: &'a RoomId, ) -> Result where @@ -387,7 +380,7 @@ impl super::Service { trace!("setting forward extremities"); self.services .state - .set_forward_extremities(room_id, leaves, state_lock) + .set_forward_extremities(room_id, leaves) .await; let insert_lock = self.mutex_insert.lock(room_id).await; diff --git a/src/service/rooms/timeline/build.rs b/src/service/rooms/timeline/build.rs index 6e0a7282c..2e849ea04 100644 --- a/src/service/rooms/timeline/build.rs +++ b/src/service/rooms/timeline/build.rs @@ -30,7 +30,7 @@ impl super::Service { partial_pdu: PartialPdu, sender: &UserId, room_id: Option<&RoomId>, - state_lock: &RoomMutexGuard, + state_lock: Option<&RoomMutexGuard>, ) -> Result { let (pdu, pdu_json) = self .create_hash_and_sign_event(partial_pdu, sender, room_id, state_lock) @@ -164,9 +164,7 @@ impl super::Service { // a moment in time where events in the current room state do not // exist trace!("Setting room state for room {room_id}"); - self.services - .state - .set_room_state(&room_id, statehashid, state_lock); + self.services.state.set_room_state(&room_id, statehashid); self.services.sync.wake_all_joined(&room_id).await; diff --git a/src/service/rooms/timeline/create.rs b/src/service/rooms/timeline/create.rs index 2f33db721..daa417b34 100644 --- a/src/service/rooms/timeline/create.rs +++ b/src/service/rooms/timeline/create.rs @@ -84,7 +84,7 @@ impl super::Service { partial_pdu: PartialPdu, sender: &UserId, room_id: Option<&RoomId>, - _mutex_lock: &RoomMutexGuard, + mutex_lock: Option<&RoomMutexGuard>, ) -> Result<(PduEvent, RoomVersionRules)> { let PartialPdu { event_type, @@ -95,6 +95,9 @@ impl super::Service { redacts, timestamp, } = partial_pdu; + if state_key.is_some() { + debug_assert!(mutex_lock.is_some(), "No state mutex held while creating state event"); + } trace!( "Creating event of type {} in room {}", @@ -287,7 +290,7 @@ impl super::Service { partial_pdu: PartialPdu, sender: &UserId, room_id: Option<&RoomId>, - mutex_lock: &RoomMutexGuard, + mutex_lock: Option<&RoomMutexGuard>, ) -> Result<(PduEvent, CanonicalJsonObject)> { if !self.services.globals.user_is_local(sender) { return Err!(Request(Forbidden("Sender must be a local user"))); diff --git a/src/service/rooms/timeline/helpers.rs b/src/service/rooms/timeline/helpers.rs index 170b35889..ba921b617 100644 --- a/src/service/rooms/timeline/helpers.rs +++ b/src/service/rooms/timeline/helpers.rs @@ -61,7 +61,7 @@ impl super::Service { }, sender, Some(room_id), - state_lock, + Some(state_lock), ) .await?; diff --git a/src/service/users/profile.rs b/src/service/users/profile.rs index 954b0eac4..96e568b7b 100644 --- a/src/service/users/profile.rs +++ b/src/service/users/profile.rs @@ -191,7 +191,7 @@ impl super::Service { PartialPdu::state(user_id.to_string(), ¤t_membership), user_id, Some(&room_id), - &state_lock, + Some(&state_lock), ) .await; }