From dafb381f7e659661910c505c20e315f2af30bbd3 Mon Sep 17 00:00:00 2001 From: Eric Swanson <64809312+ericswanson-dfinity@users.noreply.github.com> Date: Mon, 21 Sep 2020 16:22:32 -0700 Subject: [PATCH 1/2] Revert "refactor: when starting webserver, do not create an extra thread (#1037)" This reverts commit e95baad6f629cce95e3a73e36c32b26c8977998c. --- src/dfx/src/commands/bootstrap.rs | 17 +++++++++++-- src/dfx/src/lib/proxy.rs | 8 ++---- src/dfx/src/lib/webserver.rs | 42 +++++++++++++++++++++---------- 3 files changed, 46 insertions(+), 21 deletions(-) diff --git a/src/dfx/src/commands/bootstrap.rs b/src/dfx/src/commands/bootstrap.rs index 190829ddab..e5edff1c23 100644 --- a/src/dfx/src/commands/bootstrap.rs +++ b/src/dfx/src/commands/bootstrap.rs @@ -68,7 +68,9 @@ pub fn exec(env: &dyn Environment, args: &ArgMatches<'_>) -> DfxResult { let providers = get_providers(&network_descriptor)?; - let _ = webserver( + let (sender, receiver) = crossbeam::unbounded(); + + webserver( logger.clone(), build_output_root, network_descriptor, @@ -78,7 +80,18 @@ pub fn exec(env: &dyn Environment, args: &ArgMatches<'_>) -> DfxResult { .map(|uri| Url::from_str(uri).unwrap()) .collect(), &config_bootstrap.root.unwrap(), - )?; + sender, + )? + .join() + .map_err(|e| { + DfxError::RuntimeError(Error::new( + ErrorKind::Other, + format!("Failed while running frontend proxy thead -- {:?}", e), + )) + })?; + + // Wait for the webserver to be started. + let _ = receiver.recv().expect("Failed to receive server..."); // Tell the user. info!(logger, "Webserver started..."); diff --git a/src/dfx/src/lib/proxy.rs b/src/dfx/src/lib/proxy.rs index be08afa70e..4eab5d939a 100644 --- a/src/dfx/src/lib/proxy.rs +++ b/src/dfx/src/lib/proxy.rs @@ -90,20 +90,16 @@ impl Proxy { providers.push(client_api_uri); eprintln!("replica address: {:?}", ic_client_bind_addr); - let server = run_webserver( + run_webserver( self.config.logger.clone(), self.config.build_output_root.clone(), self.config.network_descriptor.clone(), self.config.bind, providers, self.config.serve_dir.clone(), + sender.clone(), )?; - // Warning: Note that HttpServer provides its own signal - // handler. That means if we provide signal handling beyond basic - // we need to either as normal "re-signal" or disable_signals(). - let _ = sender.send(server); - let mut new_server = Proxy::new(self.config); let handle = ServerHandle { sender, receiver }; new_server.server_handle = ProxyServer::Up(handle); diff --git a/src/dfx/src/lib/webserver.rs b/src/dfx/src/lib/webserver.rs index d528f2695b..bc038cf757 100644 --- a/src/dfx/src/lib/webserver.rs +++ b/src/dfx/src/lib/webserver.rs @@ -10,6 +10,7 @@ use actix_web::client::Client; use actix_web::{ http, middleware, web, App, Error, HttpMessage, HttpRequest, HttpResponse, HttpServer, }; +use crossbeam::channel::Sender; use futures::StreamExt; use serde::Deserialize; use slog::{debug, info, trace, Logger}; @@ -171,7 +172,8 @@ pub fn run_webserver( bind: SocketAddr, providers: Vec, serve_dir: PathBuf, -) -> Result { + inform_parent: Sender, +) -> Result<(), std::io::Error> { info!(logger, "binding to: {:?}", bind); const SHUTDOWN_WAIT_TIME: u64 = 60; @@ -223,7 +225,12 @@ pub fn run_webserver( .system_exit() .run(); - Ok(handler) + // Warning: Note that HttpServer provides its own signal + // handler. That means if we provide signal handling beyond basic + // we need to either as normal "re-signal" or disable_signals(). + let _ = inform_parent.send(handler); + + Ok(()) } pub fn webserver( @@ -233,7 +240,8 @@ pub fn webserver( bind: SocketAddr, clients_api_uri: Vec, serve_dir: &Path, -) -> DfxResult { + inform_parent: Sender, +) -> DfxResult> { // Verify that we cannot bind to a port that we forward to. let bound_port = bind.port(); let bind_and_forward_on_same_port = clients_api_uri.iter().any(|url| { @@ -249,14 +257,22 @@ pub fn webserver( )); } - let serve_dir = serve_dir.to_path_buf(); - run_webserver( - logger, - build_output_root, - network_descriptor, - bind, - clients_api_uri, - serve_dir, - ) - .map_err(DfxError::from) + std::thread::Builder::new() + .name("Frontend".into()) + .spawn({ + let serve_dir = serve_dir.to_path_buf(); + move || { + run_webserver( + logger, + build_output_root, + network_descriptor, + bind, + clients_api_uri, + serve_dir, + inform_parent, + ) + .unwrap() + } + }) + .map_err(DfxError::from) } From 54bef765fb6b329a44f5ae2748ac1a9ddc4bf78c Mon Sep 17 00:00:00 2001 From: Eric Swanson Date: Mon, 21 Sep 2020 16:28:41 -0700 Subject: [PATCH 2/2] Force rebuild; "Revert: " is not an allowed "conventional commit" PR title prefix.