From f0ca5253aaa4d709a058eb21ba81861c723b95dc Mon Sep 17 00:00:00 2001 From: mikoto Date: Mon, 17 Jun 2024 14:38:25 +0200 Subject: [PATCH] tokio::spawn does not run until completion of joins --- src/api/client_server/account.rs | 38 ++++++++++---------- src/config/mod.rs | 2 +- src/database/mod.rs | 2 +- src/service/globals/mod.rs | 59 +++++++++++++++++--------------- 4 files changed, 54 insertions(+), 47 deletions(-) diff --git a/src/api/client_server/account.rs b/src/api/client_server/account.rs index a3f7fe7b..3ce37fa7 100644 --- a/src/api/client_server/account.rs +++ b/src/api/client_server/account.rs @@ -291,27 +291,29 @@ pub async fn register_route(body: Ruma) -> Result, + pub default_rooms: Vec, #[serde(default)] pub well_known: WellKnownConfig, #[serde(default = "false_fn")] diff --git a/src/database/mod.rs b/src/database/mod.rs index 577182c5..ca2c7608 100644 --- a/src/database/mod.rs +++ b/src/database/mod.rs @@ -970,7 +970,7 @@ impl KeyValueDatabase { db.presenceid_presence.clear()?; // Can only return an error during the first call - services().globals.join_by_default().map_err(|e| { + services().globals.default_rooms().map_err(|e| { tracing::error!("Invalid room ID or alias in join-by-default rooms: {}", e); Error::bad_config("Invalid room ID or alias in join-by-default rooms.") diff --git a/src/service/globals/mod.rs b/src/service/globals/mod.rs index 70a3d47c..94a2480d 100644 --- a/src/service/globals/mod.rs +++ b/src/service/globals/mod.rs @@ -70,7 +70,7 @@ pub struct Service { pub roomid_mutex_state: RwLock>>>, pub roomid_mutex_federation: RwLock>>>, // this lock will be held longer pub roomid_federationhandletime: RwLock>, - join_by_default: OnceCell>, + default_rooms: OnceCell>, server_user: OwnedUserId, admin_alias: OwnedRoomAliasId, pub stateres_mutex: Arc>, @@ -224,7 +224,7 @@ impl Service { roomid_mutex_insert: RwLock::new(HashMap::new()), roomid_mutex_federation: RwLock::new(HashMap::new()), roomid_federationhandletime: RwLock::new(HashMap::new()), - join_by_default: OnceCell::new(), + default_rooms: OnceCell::new(), stateres_mutex: Arc::new(Mutex::new(())), sync_receivers: RwLock::new(HashMap::new()), rotate: RotationHandler::new(), @@ -509,47 +509,52 @@ impl Service { self.config.well_known_client() } - pub fn join_by_default(&self) -> Result<&BTreeSet> { - if let Some(set) = self.join_by_default.get() { + pub fn default_rooms(&self) -> Result<&BTreeSet> { + if let Some(set) = self.default_rooms.get() { return Ok(set); } let server_name = self.config.server_name.as_str(); - let mut join_by_default = BTreeSet::new(); + let mut default_rooms = BTreeSet::new(); - for s in self.config.join_by_default.iter().cloned() { + for s in self.config.default_rooms.iter() { let next = s .chars() .next() - .ok_or_else(|| Error::bad_config("Invalid room ID for join-by-default."))?; + .ok_or_else(|| Error::bad_config("Invalid ID for join-by-default rooms."))?; - let room_id = if next == '!' { - let id = s.split(':').next().unwrap_or(&s); + // anything that does not start '!' should be considered an alias + let room_id = match next { + '!' => OwnedRoomId::from_str(&format!( + "{}:{server_name}", + s.split(':').next().unwrap_or(&s) + )) + .map_err(|_| Error::bad_config("Invalid ID for join-by-default rooms."))?, + _ => { + let Some(room_id) = OwnedRoomAliasId::from_str(&format!( + "#{}:{server_name}", + s.split(':').next().unwrap_or(&s).trim_start_matches('#') + )) + .map_err(|_| Error::bad_config("Invalid alias for join-by-default rooms.")) + .and_then(|alias| services().rooms.alias.resolve_local_alias(&alias))? + else { + warn!("Could not resolve Room ID for join-by-default rooms locally."); - OwnedRoomId::from_str(&format!("{id}:{server_name}",)) - .map_err(|_| Error::bad_config("Invalid room ID for join-by-default rooms."))? - } else { - let id = s.split(':').next().unwrap_or(&s).trim_start_matches('#'); + continue; + }; - let alias = OwnedRoomAliasId::from_str(&format!("#{id}:{server_name}",)) - .map_err(|_| Error::bad_config("Invalid room alias for join-by-default."))?; - - let Some(room_id) = services().rooms.alias.resolve_local_alias(&alias)? else { - warn!("Could not resolve Room ID for join-by-default rooms locally."); - continue; - }; - - room_id + room_id + } }; - join_by_default.insert(room_id); + default_rooms.insert(room_id); } - self.join_by_default - .set(join_by_default) - .expect("join_by_default should be set once"); + self.default_rooms + .set(default_rooms) + .expect("default_rooms should be set once"); - self.join_by_default() + self.default_rooms() } pub fn shutdown(&self) {