diff --git a/actix-server/src/worker.rs b/actix-server/src/worker.rs index 0f788549..366dab0b 100644 --- a/actix-server/src/worker.rs +++ b/actix-server/src/worker.rs @@ -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 { @@ -356,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); @@ -466,16 +457,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(()), }; }, }