Skip to content

Commit fd3e5fb

Browse files
fakeshadowrobjtede
andauthored
Refactor actix_server WorkerState::Restarting enum variant. (#306)
Co-authored-by: Rob Ede <[email protected]>
1 parent 39d1f28 commit fd3e5fb

File tree

4 files changed

+30
-43
lines changed

4 files changed

+30
-43
lines changed

actix-server/src/config.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@ use actix_service::{
77
fn_service, IntoServiceFactory as IntoBaseServiceFactory,
88
ServiceFactory as BaseServiceFactory,
99
};
10-
use actix_utils::counter::CounterGuard;
10+
use actix_utils::{counter::CounterGuard, future::ready};
1111
use futures_core::future::LocalBoxFuture;
1212
use log::error;
1313

1414
use crate::builder::bind_addr;
1515
use crate::service::{BoxedServerService, InternalServiceFactory, StreamService};
1616
use crate::socket::{MioStream, MioTcpListener, StdSocketAddr, StdTcpListener, ToSocketAddrs};
17-
use crate::{ready, Token};
17+
use crate::Token;
1818

1919
pub struct ServiceConfig {
2020
pub(crate) services: Vec<(String, MioTcpListener)>,

actix-server/src/lib.rs

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -55,24 +55,6 @@ pub fn new() -> ServerBuilder {
5555
ServerBuilder::default()
5656
}
5757

58-
// temporary Ready type for std::future::{ready, Ready}; Can be removed when MSRV surpass 1.48
59-
#[doc(hidden)]
60-
pub struct Ready<T>(Option<T>);
61-
62-
pub(crate) fn ready<T>(t: T) -> Ready<T> {
63-
Ready(Some(t))
64-
}
65-
66-
impl<T> Unpin for Ready<T> {}
67-
68-
impl<T> Future for Ready<T> {
69-
type Output = T;
70-
71-
fn poll(self: Pin<&mut Self>, _: &mut Context<'_>) -> Poll<Self::Output> {
72-
Poll::Ready(self.get_mut().0.take().unwrap())
73-
}
74-
}
75-
7658
// a poor man's join future. joined future is only used when starting/stopping the server.
7759
// pin_project and pinned futures are overkill for this task.
7860
pub(crate) struct JoinAll<T> {
@@ -132,6 +114,8 @@ impl<T> Future for JoinAll<T> {
132114
mod test {
133115
use super::*;
134116

117+
use actix_utils::future::ready;
118+
135119
#[actix_rt::test]
136120
async fn test_join_all() {
137121
let futs = vec![ready(Ok(1)), ready(Err(3)), ready(Ok(9))];

actix-server/src/service.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,15 @@ use std::net::SocketAddr;
33
use std::task::{Context, Poll};
44

55
use actix_service::{Service, ServiceFactory as BaseServiceFactory};
6-
use actix_utils::counter::CounterGuard;
6+
use actix_utils::{
7+
counter::CounterGuard,
8+
future::{ready, Ready},
9+
};
710
use futures_core::future::LocalBoxFuture;
811
use log::error;
912

1013
use crate::socket::{FromStream, MioStream};
11-
use crate::{ready, Ready, Token};
14+
use crate::Token;
1215

1316
pub trait ServiceFactory<Stream: FromStream>: Send + Clone + 'static {
1417
type Factory: BaseServiceFactory<Stream, Config = ()>;

actix-server/src/worker.rs

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -387,27 +387,27 @@ impl Future for ServerWorker {
387387
}
388388
},
389389
WorkerState::Restarting(idx, token, ref mut fut) => {
390-
match fut.as_mut().poll(cx) {
391-
Poll::Ready(Ok(item)) => {
392-
// only interest in the first item?
393-
if let Some((token, service)) = item.into_iter().next() {
394-
trace!(
395-
"Service {:?} has been restarted",
396-
self.factories[idx].name(token)
397-
);
398-
self.services[token.0].created(service);
399-
self.state = WorkerState::Unavailable;
400-
return self.poll(cx);
401-
}
402-
}
403-
Poll::Ready(Err(_)) => {
404-
panic!(
405-
"Can not restart {:?} service",
406-
self.factories[idx].name(token)
407-
);
408-
}
409-
Poll::Pending => return Poll::Pending,
410-
}
390+
let item = ready!(fut.as_mut().poll(cx)).unwrap_or_else(|_| {
391+
panic!(
392+
"Can not restart {:?} service",
393+
self.factories[idx].name(token)
394+
)
395+
});
396+
397+
// Only interest in the first item?
398+
let (token, service) = item
399+
.into_iter()
400+
.next()
401+
.expect("No BoxedServerService. Restarting can not progress");
402+
403+
trace!(
404+
"Service {:?} has been restarted",
405+
self.factories[idx].name(token)
406+
);
407+
408+
self.services[token.0].created(service);
409+
self.state = WorkerState::Unavailable;
410+
411411
self.poll(cx)
412412
}
413413
WorkerState::Shutdown(ref mut t1, ref mut t2, ref mut tx) => {

0 commit comments

Comments
 (0)