From b9724cd995f0f5a40a3369aefa84c02a5d96d32a Mon Sep 17 00:00:00 2001 From: Nikita Vilunov Date: Thu, 24 Aug 2023 14:10:31 +0200 Subject: [PATCH] stop player fibers on shutdown --- src/core/player.rs | 14 ++++++++++++++ src/main.rs | 3 ++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/core/player.rs b/src/core/player.rs index 688bba5..3457a88 100644 --- a/src/core/player.rs +++ b/src/core/player.rs @@ -261,6 +261,19 @@ impl PlayerRegistry { let player_handle = self.get_or_create_player(id).await; player_handle.subscribe().await } + + pub async fn shutdown_all(&mut self) -> Result<()> { + let mut inner = self.0.write().unwrap(); + let mut players = HashMap::new(); + std::mem::swap(&mut players, &mut inner.players); + for (i, (k, j)) in inner.players.drain() { + drop(k); + j.await?; + log::debug!("Player stopped #{i:?}") + } + log::debug!("All players stopped"); + Ok(()) + } } /// The player registry state representation. @@ -337,6 +350,7 @@ impl Player { PlayerCommand::Cmd(cmd, connection_id) => self.handle_cmd(cmd, connection_id).await, } } + log::debug!("Shutting down player actor #{:?}", self.player_id); self } diff --git a/src/main.rs b/src/main.rs index 8595556..a623441 100644 --- a/src/main.rs +++ b/src/main.rs @@ -54,7 +54,7 @@ async fn main() -> Result<()> { let mut metrics = MetricsRegistry::new(); let storage = Storage::open(storage_config).await?; let rooms = RoomRegistry::new(&mut metrics, storage.clone())?; - let players = PlayerRegistry::empty(rooms.clone(), &mut metrics)?; + let mut players = PlayerRegistry::empty(rooms.clone(), &mut metrics)?; let telemetry_terminator = util::telemetry::launch(telemetry_config, metrics.clone(), rooms.clone()).await?; let irc = projections::irc::launch(irc_config, players.clone(), rooms.clone(), metrics.clone(), storage.clone()).await?; @@ -67,6 +67,7 @@ async fn main() -> Result<()> { xmpp.terminate().await?; irc.terminate().await?; telemetry_terminator.terminate().await?; + players.shutdown_all().await?; drop(players); drop(rooms); storage.close().await?;