From 63359210855876a9d2b39dfe9a9e6f32a518e3eb Mon Sep 17 00:00:00 2001 From: Ali MJ Al-Nasrawy Date: Thu, 2 Dec 2021 19:50:17 +0300 Subject: [PATCH 1/2] Server: hide internal structure --- actix-server/src/server.rs | 107 ++++++++++++++++++------------------- 1 file changed, 52 insertions(+), 55 deletions(-) diff --git a/actix-server/src/server.rs b/actix-server/src/server.rs index e79c0aef7b..bc0c956108 100644 --- a/actix-server/src/server.rs +++ b/actix-server/src/server.rs @@ -120,10 +120,7 @@ pub(crate) enum ServerCommand { /// } /// ``` #[must_use = "futures do nothing unless you `.await` or poll them"] -pub enum Server { - Server(ServerInner), - Error(Option), -} +pub struct Server(Result>); impl Server { /// Create server build. @@ -131,60 +128,17 @@ impl Server { ServerBuilder::default() } - pub(crate) fn new(mut builder: ServerBuilder) -> Self { - let sockets = mem::take(&mut builder.sockets) - .into_iter() - .map(|t| (t.0, t.2)) - .collect(); - - // Give log information on what runtime will be used. - let is_actix = actix_rt::System::try_current().is_some(); - let is_tokio = tokio::runtime::Handle::try_current().is_ok(); - - match (is_actix, is_tokio) { - (true, _) => info!("Actix runtime found; starting in Actix runtime"), - (_, true) => info!("Tokio runtime found; starting in existing Tokio runtime"), - (_, false) => panic!("Actix or Tokio runtime not found; halting"), - } - - for (_, name, lst) in &builder.sockets { - info!( - r#"Starting service: "{}", workers: {}, listening on: {}"#, - name, - builder.threads, - lst.local_addr() - ); - } - - match Accept::start(sockets, &builder) { - Ok((waker_queue, worker_handles)) => { - // construct OS signals listener future - let signals = (builder.listen_os_signals).then(Signals::new); - - Self::Server(ServerInner { - cmd_tx: builder.cmd_tx.clone(), - cmd_rx: builder.cmd_rx, - signals, - waker_queue, - worker_handles, - worker_config: builder.worker_config, - services: builder.factories, - exit: builder.exit, - stop_task: None, - }) - } - - Err(err) => Self::Error(Some(err)), - } + pub(crate) fn new(builder: ServerBuilder) -> Self { + Server(ServerInner::new(builder).map_err(Some)) } /// Get a handle for ServerFuture that can be used to change state of actix server. /// /// See [ServerHandle](ServerHandle) for usage. pub fn handle(&self) -> ServerHandle { - match self { - Server::Server(inner) => ServerHandle::new(inner.cmd_tx.clone()), - Server::Error(err) => { + match &self.0 { + Ok(inner) => ServerHandle::new(inner.cmd_tx.clone()), + Err(err) => { // TODO: i don't think this is the best way to handle server startup fail panic!( "server handle can not be obtained because server failed to start up: {}", @@ -199,12 +153,12 @@ impl Future for Server { type Output = io::Result<()>; fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { - match self.as_mut().get_mut() { - Self::Error(err) => Poll::Ready(Err(err + match &mut self.as_mut().get_mut().0 { + Err(err) => Poll::Ready(Err(err .take() .expect("Server future cannot be polled after error"))), - Self::Server(inner) => { + Ok(inner) => { // poll Signals if let Some(ref mut signals) = inner.signals { if let Poll::Ready(signal) = Pin::new(signals).poll(cx) { @@ -247,6 +201,49 @@ pub struct ServerInner { } impl ServerInner { + fn new(mut builder: ServerBuilder) -> io::Result { + let sockets = mem::take(&mut builder.sockets) + .into_iter() + .map(|t| (t.0, t.2)) + .collect(); + + // Give log information on what runtime will be used. + let is_actix = actix_rt::System::try_current().is_some(); + let is_tokio = tokio::runtime::Handle::try_current().is_ok(); + + match (is_actix, is_tokio) { + (true, _) => info!("Actix runtime found; starting in Actix runtime"), + (_, true) => info!("Tokio runtime found; starting in existing Tokio runtime"), + (_, false) => panic!("Actix or Tokio runtime not found; halting"), + } + + for (_, name, lst) in &builder.sockets { + info!( + r#"Starting service: "{}", workers: {}, listening on: {}"#, + name, + builder.threads, + lst.local_addr() + ); + } + + let (waker_queue, worker_handles) = Accept::start(sockets, &builder)?; + + // construct OS signals listener future + let signals = (builder.listen_os_signals).then(Signals::new); + + Ok(ServerInner { + cmd_tx: builder.cmd_tx.clone(), + cmd_rx: builder.cmd_rx, + signals, + waker_queue, + worker_handles, + worker_config: builder.worker_config, + services: builder.factories, + exit: builder.exit, + stop_task: None, + }) + } + fn handle_cmd(&mut self, item: ServerCommand) -> Option> { match item { ServerCommand::Pause(tx) => { From 093023e0def75520692450ea675d28ee19d7e902 Mon Sep 17 00:00:00 2001 From: Rob Ede Date: Sun, 5 Dec 2021 14:45:58 +0000 Subject: [PATCH 2/2] Update CHANGES.md --- actix-server/CHANGES.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/actix-server/CHANGES.md b/actix-server/CHANGES.md index 51da40f2be..3c1c32c7e7 100644 --- a/actix-server/CHANGES.md +++ b/actix-server/CHANGES.md @@ -1,6 +1,9 @@ # Changes ## Unreleased - 2021-xx-xx +* Hide implementation details of `Server`. [#424] + +[#424]: https://github.com/actix/actix-net/pull/424 ## 2.0.0-beta.9 - 2021-11-15