From 1beea5967f1fdcebb9fd414eae3e1dce5d8e2c4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20M=C3=A4rtens?= Date: Mon, 17 Aug 2020 14:21:36 +0200 Subject: [PATCH 1/2] investigate if participant mutex causes server hang --- server/src/events/player.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/server/src/events/player.rs b/server/src/events/player.rs index 439fc613d1..3e5aac94d1 100644 --- a/server/src/events/player.rs +++ b/server/src/events/player.rs @@ -80,7 +80,13 @@ pub fn handle_exit_ingame(server: &mut Server, entity: EcsEntity) { pub fn handle_client_disconnect(server: &mut Server, entity: EcsEntity) -> Event { if let Some(client) = server.state().read_storage::().get(entity) { trace!("Closing participant of client"); - let participant = client.participant.lock().unwrap().take().unwrap(); + let participant = match client.participant.try_lock() { + Ok(mut p) => p.take().unwrap(), + Err(e) => { + error!(?e, "coudln't lock participant for removal"); + panic!("coudlnt lock participant, not good!"); + }, + }; if let Err(e) = block_on(participant.disconnect()) { debug!( ?e, From 08e7063a3666dcd15b8021df94fd635b638bdb35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20M=C3=A4rtens?= Date: Mon, 17 Aug 2020 16:34:02 +0200 Subject: [PATCH 2/2] no longer block when disconnecting a player --- server/src/events/player.rs | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/server/src/events/player.rs b/server/src/events/player.rs index 3e5aac94d1..306300605e 100644 --- a/server/src/events/player.rs +++ b/server/src/events/player.rs @@ -10,7 +10,7 @@ use common::{ }; use futures_executor::block_on; use specs::{saveload::MarkerAllocator, Builder, Entity as EcsEntity, WorldExt}; -use tracing::{debug, error, trace}; +use tracing::{debug, error, trace, warn}; pub fn handle_exit_ingame(server: &mut Server, entity: EcsEntity) { let state = server.state_mut(); @@ -84,15 +84,27 @@ pub fn handle_client_disconnect(server: &mut Server, entity: EcsEntity) -> Event Ok(mut p) => p.take().unwrap(), Err(e) => { error!(?e, "coudln't lock participant for removal"); - panic!("coudlnt lock participant, not good!"); + return Event::ClientDisconnected { entity }; }, }; - if let Err(e) = block_on(participant.disconnect()) { - debug!( - ?e, - "Error when disconnecting client, maybe the pipe already broke" - ); - }; + std::thread::spawn(|| { + let pid = participant.remote_pid(); + let now = std::time::Instant::now(); + trace!(?pid, "start disconnect"); + if let Err(e) = block_on(participant.disconnect()) { + debug!( + ?e, + "Error when disconnecting client, maybe the pipe already broke" + ); + }; + trace!(?pid, "finished disconnect"); + let elapsed = now.elapsed(); + if elapsed.as_millis() > 100 { + warn!(?elapsed, "disconecting took quite long"); + } else { + debug!(?elapsed, "disconecting took"); + } + }); } let state = server.state_mut();