From f3a7d0d19a1c2bc55d9c3467f9f81765ebd2a7f5 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sun, 22 Aug 2021 18:12:12 +0100 Subject: [PATCH] panic handling in webserver task too Signed-off-by: Ian Jackson --- server/server.rs | 20 ++++++++++++++++---- src/prelude.rs | 4 ++-- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/server/server.rs b/server/server.rs index a10961e..9ce63aa 100644 --- a/server/server.rs +++ b/server/server.rs @@ -165,7 +165,13 @@ async fn main() { let global_ = global_.clone(); let conn = Arc::new(format!("[{}]", conn.remote_addr())); async { Ok::<_, Void>( hyper::service::service_fn(move |req| { - sweb::handle(conn.clone(), global_.clone(), req) + AssertUnwindSafe( + sweb::handle(conn.clone(), global_.clone(), req) + ) + .catch_unwind() + .map(|r| r.unwrap_or_else(|_|{ + crash(Err("panicked".into()), "webserver request task") + })) }) ) } } ); @@ -200,8 +206,14 @@ async fn main() { ).await; let task = &tasks[died_i].1; - match output { - Err(je) => error!("task panicked! {}: {}", task, &je), - Ok(e) => error!("task failed! {}: {}", task, &e), + let output = output.map_err(|je| je.to_string()); + crash(output, task); +} + +pub fn crash(what_happened: Result, task: &str) -> ! { + match what_happened { + Err(je) => error!("task crashed! {}: {}", task, &je), + Ok(e) => error!("task failed! {}: {}", task, &e ), } + process::exit(12); } diff --git a/src/prelude.rs b/src/prelude.rs index c7c53e1..9e56662 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -17,7 +17,7 @@ pub use std::iter; pub use std::mem; pub use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr}; pub use std::path::{Path, PathBuf}; -pub use std::panic; +pub use std::panic::{self, AssertUnwindSafe}; pub use std::process; pub use std::pin::Pin; pub use std::str::{self, FromStr}; @@ -46,7 +46,7 @@ pub use tokio::io::{AsyncBufReadExt, AsyncWriteExt}; pub use tokio::pin; pub use tokio::select; pub use tokio::sync::{mpsc, oneshot}; -pub use tokio::task::{self, JoinHandle}; +pub use tokio::task::{self, JoinError, JoinHandle}; pub use tokio::time::{Duration, Instant}; pub use void::{self, Void, ResultVoidExt, ResultVoidErrExt}; -- 2.30.2