From 76d3e8ee755b1eb4cd79776380b07daacd17e9dc Mon Sep 17 00:00:00 2001 From: fakeshadow <24548779@qq.com> Date: Tue, 13 Apr 2021 10:13:03 +0800 Subject: [PATCH] close channel early on drop of ServerWorker --- actix-server/src/worker.rs | 7 +++++++ actix-server/tests/test_server.rs | 3 ++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/actix-server/src/worker.rs b/actix-server/src/worker.rs index cd7491d7..d62409bc 100644 --- a/actix-server/src/worker.rs +++ b/actix-server/src/worker.rs @@ -135,6 +135,13 @@ pub(crate) struct ServerWorker { shutdown_timeout: Duration, } +/// Set worker to unavailable when dropping. +impl Drop for ServerWorker { + fn drop(&mut self) { + self.rx.close(); + } +} + struct WorkerService { factory: usize, status: WorkerServiceStatus, diff --git a/actix-server/tests/test_server.rs b/actix-server/tests/test_server.rs index e09f053b..3af072bb 100644 --- a/actix-server/tests/test_server.rs +++ b/actix-server/tests/test_server.rs @@ -517,6 +517,8 @@ async fn worker_restart() { let (server, sys) = rx.recv().unwrap(); + sleep(Duration::from_secs(3)).await; + let mut buf = [0; 8]; // worker 1 would not restart and return it's id consistently. @@ -545,7 +547,6 @@ async fn worker_restart() { // worker 2 restarting and work goes to worker 1. let mut stream = TcpStream::connect(addr).await.unwrap(); - let n = stream.read(&mut buf).await.unwrap(); let id = String::from_utf8_lossy(&buf[0..n]); assert_eq!("1", id);