From fcc8b860fcaf33a80c26742327b5fcfd2d38cc1f Mon Sep 17 00:00:00 2001 From: Brian Picciano Date: Thu, 29 Feb 2024 10:48:53 +0100 Subject: [PATCH] Handle TcpListener.accept errors more gracefully --- src/service/gemini.rs | 12 ++++++++++-- src/service/http/tasks.rs | 18 +++++++++++------- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/service/gemini.rs b/src/service/gemini.rs index 10add1c..d820614 100644 --- a/src/service/gemini.rs +++ b/src/service/gemini.rs @@ -6,6 +6,7 @@ pub use config::*; use crate::error::unexpected::{self, Mappable}; use crate::{domain, service, task_stack, util}; +use core::time::Duration; use std::sync; use tokio_util::sync::CancellationToken; @@ -248,8 +249,15 @@ async fn listen( loop { let (conn, addr) = tokio::select! { - res = listener.accept() => res.or_unexpected_while("accepting connection")?, - _ = canceller.cancelled() => return Ok(()), + res = listener.accept() => { + if let Err(err) = res { + log::error!("Failed to accept new gemini request on {addr}: {err}"); + tokio::time::sleep(Duration::from_secs(2)).await; + continue; + } + res.unwrap() + }, + _ = canceller.cancelled() => return Ok(()), }; let service = service.clone(); diff --git a/src/service/http/tasks.rs b/src/service/http/tasks.rs index 2636e15..dfb9d45 100644 --- a/src/service/http/tasks.rs +++ b/src/service/http/tasks.rs @@ -1,8 +1,9 @@ -use crate::error::unexpected::{self, Intoable, Mappable}; +use crate::error::unexpected::{self, Mappable}; use crate::service; use std::{net, pin, sync}; +use core::time::Duration; use tokio_util::sync::CancellationToken; async fn serve_conn( @@ -21,7 +22,6 @@ async fn serve_conn( req_is_https, ); - use core::time::Duration; use hyper_util::{ rt::tokio::{TokioExecutor, TokioIo, TokioTimer}, server::conn::auto::Builder, @@ -95,8 +95,10 @@ pub async fn listen_http( worker.done() }); }, - Err(err) => - return Err(err.into_unexpected_while(format!("accepting new HTTP requests on {addr}"))), + Err(err) => { + log::error!("Failed to accept new HTTP request on {addr}: {err}"); + tokio::time::sleep(Duration::from_secs(2)).await; + }, } }, _ = canceller.cancelled() => { @@ -144,7 +146,7 @@ pub async fn listen_https( let stream = match server_config.accept(raw_stream).await { Ok(s) => s, Err(err) => { - log::warn!("failed to accept TLS connection on {addr}: {err}"); + log::warn!("Failed to accept TLS connection on {addr}: {err}"); worker.done(); return; } @@ -154,8 +156,10 @@ pub async fn listen_https( worker.done(); }); }, - Err(err) => - return Err(err.into_unexpected_while(format!("accepting new HTTPS requests on {addr}"))), + Err(err) => { + log::error!("Failed to accept new HTTPS request on {addr}: {err}"); + tokio::time::sleep(Duration::from_secs(2)).await; + }, } }, _ = canceller.cancelled() => {