From acc6d1d57d9474fe2269e76ea4d7e03814dd8343 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20M=C3=A4rtens?= Date: Mon, 6 Jul 2020 01:29:28 +0200 Subject: [PATCH] dropping participant on client disconnect clients --- client/src/lib.rs | 12 +++++++----- server/src/client.rs | 4 +++- server/src/events/player.rs | 14 +++++++++++++- server/src/lib.rs | 1 + 4 files changed, 24 insertions(+), 7 deletions(-) diff --git a/client/src/lib.rs b/client/src/lib.rs index 91db147335..c6ba6c119d 100644 --- a/client/src/lib.rs +++ b/client/src/lib.rs @@ -42,7 +42,7 @@ use std::{ sync::Arc, time::{Duration, Instant}, }; -use tracing::{debug, error, warn}; +use tracing::{debug, error, trace, warn}; use uvth::{ThreadPool, ThreadPoolBuilder}; use vek::*; @@ -312,10 +312,11 @@ impl Client { /// Send disconnect message to the server pub fn request_logout(&mut self) { + debug!("Requesting logout from server"); if let Err(e) = self.singleton_stream.send(ClientMsg::Disconnect) { error!( ?e, - "couldn't send disconnect package to server, did server close already?" + "Couldn't send disconnect package to server, did server close already?" ); } } @@ -1191,11 +1192,12 @@ impl Client { impl Drop for Client { fn drop(&mut self) { + trace!("Dropping client"); if let Err(e) = self.singleton_stream.send(ClientMsg::Disconnect) { warn!( - "error during drop of client, couldn't send disconnect package, is the connection \ - already closed? : {}", - e + ?e, + "Error during drop of client, couldn't send disconnect package, is the connection \ + already closed?", ); } } diff --git a/server/src/client.rs b/server/src/client.rs index 412d36a7d1..ea3ecce838 100644 --- a/server/src/client.rs +++ b/server/src/client.rs @@ -1,12 +1,14 @@ use common::msg::{ClientState, RequestStateError, ServerMsg}; use hashbrown::HashSet; -use network::Stream; +use network::{Participant, Stream}; use specs::{Component, FlaggedStorage}; use specs_idvs::IdvStorage; +use std::sync::{Arc, Mutex}; use vek::*; pub struct Client { pub client_state: ClientState, + pub participant: Mutex>>, pub singleton_stream: Stream, pub last_ping: f64, pub login_msg_sent: bool, diff --git a/server/src/events/player.rs b/server/src/events/player.rs index aae303c47f..53286ab115 100644 --- a/server/src/events/player.rs +++ b/server/src/events/player.rs @@ -8,8 +8,9 @@ use common::{ msg::{ClientState, PlayerListUpdate, ServerMsg}, sync::{Uid, UidAllocator}, }; +use futures_executor::block_on; use specs::{saveload::MarkerAllocator, Builder, Entity as EcsEntity, WorldExt}; -use tracing::error; +use tracing::{debug, error, trace}; pub fn handle_exit_ingame(server: &mut Server, entity: EcsEntity) { let state = server.state_mut(); @@ -46,6 +47,17 @@ 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(); + if let Err(e) = block_on(server.network.disconnect(participant)) { + debug!( + ?e, + "Error when disconnecting client, maybe the pipe already broke" + ); + }; + } + let state = server.state_mut(); // Tell other clients to remove from player list diff --git a/server/src/lib.rs b/server/src/lib.rs index 1817330397..d0943b2d12 100644 --- a/server/src/lib.rs +++ b/server/src/lib.rs @@ -601,6 +601,7 @@ impl Server { let mut client = Client { client_state: ClientState::Connected, + participant: std::sync::Mutex::new(Some(participant)), singleton_stream, last_ping: self.state.get_time(), login_msg_sent: false,