From fdac52aa1134b805cb8932f6a3462020f7e945d5 Mon Sep 17 00:00:00 2001 From: fakeshadow <24548779@qq.com> Date: Fri, 2 Apr 2021 04:22:05 -0700 Subject: [PATCH 1/2] Refactor Worker::shutdown mehtod (#308) --- actix-server/src/worker.rs | 30 +++++++++++++----------------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/actix-server/src/worker.rs b/actix-server/src/worker.rs index 63c45757..e9b609f4 100644 --- a/actix-server/src/worker.rs +++ b/actix-server/src/worker.rs @@ -8,7 +8,7 @@ use std::time::Duration; use actix_rt::time::{sleep, Sleep}; use actix_rt::{spawn, Arbiter}; use actix_utils::counter::Counter; -use futures_core::future::LocalBoxFuture; +use futures_core::{future::LocalBoxFuture, ready}; use log::{error, info, trace}; use tokio::sync::mpsc::{unbounded_channel, UnboundedReceiver, UnboundedSender}; use tokio::sync::oneshot; @@ -263,19 +263,16 @@ impl ServerWorker { } fn shutdown(&mut self, force: bool) { - if force { - self.services.iter_mut().for_each(|srv| { - if srv.status == WorkerServiceStatus::Available { - srv.status = WorkerServiceStatus::Stopped; - } + self.services + .iter_mut() + .filter(|srv| srv.status == WorkerServiceStatus::Available) + .for_each(|srv| { + srv.status = if force { + WorkerServiceStatus::Stopped + } else { + WorkerServiceStatus::Stopping + }; }); - } else { - self.services.iter_mut().for_each(move |srv| { - if srv.status == WorkerServiceStatus::Available { - srv.status = WorkerServiceStatus::Stopping; - } - }); - } } fn check_readiness(&mut self, cx: &mut Context<'_>) -> Result { @@ -466,16 +463,15 @@ impl Future for ServerWorker { } } - match Pin::new(&mut self.rx).poll_recv(cx) { + match ready!(Pin::new(&mut self.rx).poll_recv(cx)) { // handle incoming io stream - Poll::Ready(Some(WorkerCommand(msg))) => { + Some(WorkerCommand(msg)) => { let guard = self.conns.get(); let _ = self.services[msg.token.0] .service .call((Some(guard), msg.io)); } - Poll::Pending => return Poll::Pending, - Poll::Ready(None) => return Poll::Ready(()), + None => return Poll::Ready(()), }; }, } From d8889c63ef13b5be584cb99f557ff6072de57875 Mon Sep 17 00:00:00 2001 From: fakeshadow <24548779@qq.com> Date: Fri, 2 Apr 2021 04:49:12 -0700 Subject: [PATCH 2/2] Do not do double check on connection num when entering graceful shutdown (#309) --- actix-server/src/worker.rs | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/actix-server/src/worker.rs b/actix-server/src/worker.rs index e9b609f4..5e843983 100644 --- a/actix-server/src/worker.rs +++ b/actix-server/src/worker.rs @@ -353,18 +353,12 @@ impl Future for ServerWorker { return Poll::Ready(()); } else if graceful { self.shutdown(false); - let num = num_connections(); - if num != 0 { - info!("Graceful worker shutdown, {} connections", num); - self.state = WorkerState::Shutdown( - Box::pin(sleep(Duration::from_secs(1))), - Box::pin(sleep(self.config.shutdown_timeout)), - Some(result), - ); - } else { - let _ = result.send(true); - return Poll::Ready(()); - } + info!("Graceful worker shutdown, {} connections", num); + self.state = WorkerState::Shutdown( + Box::pin(sleep(Duration::from_secs(1))), + Box::pin(sleep(self.config.shutdown_timeout)), + Some(result), + ); } else { info!("Force shutdown worker, {} connections", num); self.shutdown(true);