From 2f8f1dbf48bb63734c912c22f6b5627a9a6cbb18 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Fri, 19 Mar 2021 18:21:00 +0100 Subject: [PATCH 1/2] Remove `civet` server option --- Cargo.lock | 18 ------- Cargo.toml | 1 - docs/BACKEND.md | 3 +- src/bin/server.rs | 127 ++++++++++++++-------------------------------- 4 files changed, 39 insertions(+), 110 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7b495899d31..d74dbd76dcc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -253,7 +253,6 @@ dependencies = [ "base64 0.13.0", "cargo-registry-s3", "chrono", - "civet", "claim", "clap", "comrak", @@ -366,23 +365,6 @@ dependencies = [ "generic-array 0.14.4", ] -[[package]] -name = "civet" -version = "0.12.0-alpha.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b38e18226401dff3e26aa36d5128707af657649a56f134fb29b465daa3bd6d1" -dependencies = [ - "civet-sys", - "conduit", - "libc", -] - -[[package]] -name = "civet-sys" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "958d15372bf28b7983cb35e1d4bf36dd843b0d42e507c1c73aad7150372c5936" - [[package]] name = "claim" version = "0.4.0" diff --git a/Cargo.toml b/Cargo.toml index e23c5ac4779..0bc6daecdb9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -34,7 +34,6 @@ anyhow = "1.0" base64 = "0.13" cargo-registry-s3 = { path = "src/s3", version = "0.2.0" } chrono = { version = "0.4.0", features = ["serde"] } -civet = "0.12.0-alpha.5" clap = "=3.0.0-beta.2" comrak = { version = "0.9", default-features = false } diff --git a/docs/BACKEND.md b/docs/BACKEND.md index dc215d19a68..04624e965fa 100644 --- a/docs/BACKEND.md +++ b/docs/BACKEND.md @@ -12,11 +12,10 @@ The server does the following things: 3. Reads values from environment variables to configure a new instance of `cargo_registry::App` 4. Adds middleware to the app by calling `cargo_registry::middleware` 5. Syncs the categories defined in *src/categories.toml* with the categories in the database -6. Starts either a [conduit] or a [hyper] server that uses the `cargo_registry::App` instance +6. Starts a [hyper] server that uses the `cargo_registry::App` instance 7. Tells Nginx on Heroku that the application is ready to receive requests, if running on Heroku 8. Blocks forever (or until the process is killed) -[civet]: https://crates.io/crates/civet [hyper]: https://crates.io/crates/hyper ## Routes diff --git a/src/bin/server.rs b/src/bin/server.rs index c9fcb86d485..9f953f6f0a6 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -2,30 +2,17 @@ #![allow(unknown_lints)] use cargo_registry::{boot, App, Env}; -use std::{ - borrow::Cow, - fs::File, - process::Command, - sync::{mpsc::channel, Arc, Mutex}, - time::Duration, -}; - -use civet::Server as CivetServer; +use std::{borrow::Cow, fs::File, process::Command, sync::Arc, time::Duration}; + use conduit_hyper::Service; use futures_util::future::FutureExt; use reqwest::blocking::Client; use sentry::{ClientOptions, IntoDsn}; +use tokio::io::AsyncWriteExt; +use tokio::signal::unix::{signal, SignalKind}; const CORE_THREADS: usize = 4; -#[allow(clippy::large_enum_variant)] -enum Server { - Civet(CivetServer), - Hyper(tokio::runtime::Runtime, tokio::task::JoinHandle<()>), -} - -use Server::*; - fn main() -> Result<(), Box> { let _sentry = dotenv::var("SENTRY_DSN_API") .ok() @@ -90,52 +77,41 @@ fn main() -> Result<(), Box> { } }); - let server = if dotenv::var("WEB_USE_CIVET").is_err() { - use tokio::io::AsyncWriteExt; - use tokio::signal::unix::{signal, SignalKind}; - - println!("Booting with a hyper based server"); - - let rt = tokio::runtime::Builder::new_multi_thread() - .enable_all() - .worker_threads(CORE_THREADS) - .max_blocking_threads(threads as usize) - .build() - .unwrap(); - - let handler = Arc::new(conduit_hyper::BlockingHandler::new(handler)); - let make_service = - hyper::service::make_service_fn(move |socket: &hyper::server::conn::AddrStream| { - let addr = socket.remote_addr(); - let handler = handler.clone(); - async move { Service::from_blocking(handler, addr) } - }); - - let addr = (ip, port).into(); - #[allow(clippy::async_yields_async)] - let server = rt.block_on(async { hyper::Server::bind(&addr).serve(make_service) }); - - let mut sig_int = rt.block_on(async { signal(SignalKind::interrupt()) })?; - let mut sig_term = rt.block_on(async { signal(SignalKind::terminate()) })?; - - let server = server.with_graceful_shutdown(async move { - // Wait for either signal - futures_util::select! { - _ = sig_int.recv().fuse() => {}, - _ = sig_term.recv().fuse() => {}, - }; - let mut stdout = tokio::io::stdout(); - stdout.write_all(b"Starting graceful shutdown\n").await.ok(); + println!("Booting with a hyper based server"); + + let rt = tokio::runtime::Builder::new_multi_thread() + .enable_all() + .worker_threads(CORE_THREADS) + .max_blocking_threads(threads as usize) + .build() + .unwrap(); + + let handler = Arc::new(conduit_hyper::BlockingHandler::new(handler)); + let make_service = + hyper::service::make_service_fn(move |socket: &hyper::server::conn::AddrStream| { + let addr = socket.remote_addr(); + let handler = handler.clone(); + async move { Service::from_blocking(handler, addr) } }); - let server = rt.spawn(async { server.await.unwrap() }); - Hyper(rt, server) - } else { - println!("Booting with a civet based server"); - let mut cfg = civet::Config::new(); - cfg.port(port).threads(threads).keep_alive(true); - Civet(CivetServer::start(cfg, handler).unwrap()) - }; + let addr = (ip, port).into(); + #[allow(clippy::async_yields_async)] + let server = rt.block_on(async { hyper::Server::bind(&addr).serve(make_service) }); + + let mut sig_int = rt.block_on(async { signal(SignalKind::interrupt()) })?; + let mut sig_term = rt.block_on(async { signal(SignalKind::terminate()) })?; + + let server = server.with_graceful_shutdown(async move { + // Wait for either signal + futures_util::select! { + _ = sig_int.recv().fuse() => {}, + _ = sig_term.recv().fuse() => {}, + }; + let mut stdout = tokio::io::stdout(); + stdout.write_all(b"Starting graceful shutdown\n").await.ok(); + }); + + let server = rt.spawn(async { server.await.unwrap() }); println!("listening on port {}", port); @@ -159,17 +135,7 @@ fn main() -> Result<(), Box> { } // Block the main thread until the server has shutdown - match server { - Hyper(rt, server) => { - rt.block_on(async { server.await.unwrap() }); - } - Civet(server) => { - let (tx, rx) = channel::<()>(); - ctrlc_handler(move || tx.send(()).unwrap_or(())); - rx.recv().unwrap(); - drop(server); - } - } + rt.block_on(async { server.await.unwrap() }); println!("Persisting remaining downloads counters"); if let Err(err) = app.downloads_counter.persist_all_shards(&app) { @@ -180,23 +146,6 @@ fn main() -> Result<(), Box> { Ok(()) } -fn ctrlc_handler(f: F) -where - F: FnOnce() + Send + 'static, -{ - let call_once = Mutex::new(Some(f)); - - ctrlc::set_handler(move || { - if let Some(f) = call_once.lock().unwrap().take() { - println!("Starting graceful shutdown"); - f(); - } else { - println!("Already sent signal to start graceful shutdown"); - } - }) - .unwrap(); -} - fn downloads_counter_thread(app: Arc) { let interval = Duration::from_millis( (app.config.downloads_persist_interval_ms / app.downloads_counter.shards_count()) as u64, From 04e25502b6c6ef008d8c8309c2bdb90022e1e981 Mon Sep 17 00:00:00 2001 From: Justin Geibel Date: Fri, 19 Mar 2021 20:19:53 -0400 Subject: [PATCH 2/2] Drop ctrlc crate which is now unused --- Cargo.lock | 67 ++++++++++++++++-------------------------------------- Cargo.toml | 1 - 2 files changed, 19 insertions(+), 49 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d74dbd76dcc..e963b5fd147 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -147,7 +147,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d117600f438b1707d4e4ae15d3595657288f8235a0eb593e80ecc98ab34e1bc" dependencies = [ "addr2line", - "cfg-if 1.0.0", + "cfg-if", "libc", "miniz_oxide", "object", @@ -266,7 +266,6 @@ dependencies = [ "conduit-static", "conduit-test", "cookie", - "ctrlc", "dashmap", "derive_deref", "dialoguer", @@ -330,12 +329,6 @@ dependencies = [ "jobserver", ] -[[package]] -name = "cfg-if" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" - [[package]] name = "cfg-if" version = "1.0.0" @@ -606,7 +599,7 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", ] [[package]] @@ -638,23 +631,13 @@ dependencies = [ "cipher", ] -[[package]] -name = "ctrlc" -version = "3.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b57a92e9749e10f25a171adcebfafe72991d45e7ec2dcb853e8f83d9dafaeb08" -dependencies = [ - "nix", - "winapi", -] - [[package]] name = "dashmap" version = "4.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e77a43b28d0668df09411cb0bc9a8c2adc40f9a048afe863e05fd43251e8e39c" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "num_cpus", ] @@ -778,7 +761,7 @@ version = "0.8.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "80df024fbc5ac80f87dfef0d9f5209a252f2a497f7f42944cff24d8253cac065" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", ] [[package]] @@ -799,7 +782,7 @@ version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d34cfa13a63ae058bfa601fe9e313bbdb3746427c1459185464ce0fcf62e1e8" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "libc", "redox_syscall", "winapi", @@ -811,7 +794,7 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd3aec53de10fe96d7d8c565eb17f2c687bb5518a2ec453b5b1252964526abe0" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "crc32fast", "libc", "miniz_oxide", @@ -961,7 +944,7 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "libc", "wasi 0.9.0+wasi-snapshot-preview1", ] @@ -972,7 +955,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "libc", "wasi 0.10.2+wasi-snapshot-preview1", ] @@ -1263,7 +1246,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61124eeebbd69b8190558df225adf7e4caafce0d743919e5d6b19652314ec5ec" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", ] [[package]] @@ -1438,7 +1421,7 @@ version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", ] [[package]] @@ -1593,18 +1576,6 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" -[[package]] -name = "nix" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83450fe6a6142ddd95fb064b746083fc4ef1705fe81f64a64e1d4b39f54a1055" -dependencies = [ - "bitflags", - "cc", - "cfg-if 0.1.10", - "libc", -] - [[package]] name = "nom" version = "6.1.0" @@ -1703,7 +1674,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "038d43985d1ddca7a9900630d8cd031b56e4794eecc2e9ea39dd17aa04399a70" dependencies = [ "bitflags", - "cfg-if 1.0.0", + "cfg-if", "foreign-types", "lazy_static", "libc", @@ -1752,7 +1723,7 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa7a782938e745763fe6907fc6ba86946d72f49fe7e21de074e08128a99fb018" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "instant", "libc", "redox_syscall", @@ -2511,7 +2482,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4b312c3731e3fe78a185e6b9b911a7aa715b8e31cce117975219aab2acf285d" dependencies = [ "block-buffer 0.9.0", - "cfg-if 1.0.0", + "cfg-if", "cpuid-bool 0.1.2", "digest 0.9.0", "opaque-debug 0.3.0", @@ -2530,7 +2501,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa827a14b29ab7f44778d14a88d3cb76e949c45083f7dbfa507d0cb699dc12de" dependencies = [ "block-buffer 0.9.0", - "cfg-if 1.0.0", + "cfg-if", "cpuid-bool 0.1.2", "digest 0.9.0", "opaque-debug 0.3.0", @@ -2584,7 +2555,7 @@ version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "122e570113d28d773067fab24266b66753f6ea915758651696b6e35e49f88d6e" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "libc", "winapi", ] @@ -2748,7 +2719,7 @@ version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "libc", "rand 0.8.3", "redox_syscall", @@ -2981,7 +2952,7 @@ version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7d40a22fd029e33300d8d89a5cc8ffce18bb7c587662f54629e94c9de5487f3" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "log", "pin-project-lite", "tracing-attributes", @@ -3252,7 +3223,7 @@ version = "0.2.70" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55c0f7123de74f0dab9b7d00fd614e7b19349cd1e2f5252bbe9b1754b59433be" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "serde", "serde_json", "wasm-bindgen-macro", @@ -3279,7 +3250,7 @@ version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3de431a2910c86679c34283a33f66f4e4abd7e0aec27b6669060148872aadf94" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "js-sys", "wasm-bindgen", "web-sys", diff --git a/Cargo.toml b/Cargo.toml index 0bc6daecdb9..33100a4f707 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -47,7 +47,6 @@ conduit-router = "0.9.0-alpha.6" conduit-static = "0.9.0-alpha.3" cookie = { version = "0.15", features = ["secure"] } -ctrlc = { version = "3.0", features = ["termination"] } dashmap = { version = "4.0.2", features = ["raw-api"] } derive_deref = "1.1.1" dialoguer = "0.7.1"