From 15ac923bd9b854cb1da995bacedeb2081eacedac Mon Sep 17 00:00:00 2001 From: michel Date: Sat, 18 Jul 2026 14:37:35 +0200 Subject: [PATCH] fix: stop the previous peer actor when re-registering a username register_peer inserted the new handle and silently dropped the old one, leaving the previous actor running as an orphan that pins a thread-pool worker forever; its later shutdown could also remove the replacement connection from the registry. The displaced actor is now told to stop. --- soulseek-rs-lib/src/actor/peer_registry.rs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/soulseek-rs-lib/src/actor/peer_registry.rs b/soulseek-rs-lib/src/actor/peer_registry.rs index 6dcc1e2..01b14cc 100644 --- a/soulseek-rs-lib/src/actor/peer_registry.rs +++ b/soulseek-rs-lib/src/actor/peer_registry.rs @@ -49,7 +49,17 @@ impl PeerRegistry { .peers .lock_safe() .map_err(|e| format!("peer registry lock poisoned: {}", e))?; - peers.insert(username.clone(), handle.clone()); + // Stop any actor already registered under this username so it does not + // become an orphan pinning a pool worker forever (and so its later + // shutdown cannot remove this new connection from the registry). + if let Some(old_handle) = peers.insert(username.clone(), handle.clone()) + { + let _ = old_handle.stop(); + debug!( + "[peer_registry] Replaced existing peer actor for {}", + username + ); + } Ok(handle) }