diff --git a/core/startos/src/net/web_server.rs b/core/startos/src/net/web_server.rs index 8fcd74d8a..87185e91f 100644 --- a/core/startos/src/net/web_server.rs +++ b/core/startos/src/net/web_server.rs @@ -6,8 +6,8 @@ use std::task::Poll; use std::time::Duration; use axum::Router; -use futures::FutureExt; use futures::future::Either; +use futures::FutureExt; use helpers::NonDetachingJoinHandle; use hyper_util::rt::{TokioIo, TokioTimer}; use tokio::net::{TcpListener, TcpStream}; @@ -15,7 +15,7 @@ use tokio::sync::oneshot; use crate::context::{DiagnosticContext, InitContext, InstallContext, RpcContext, SetupContext}; use crate::net::gateway::{ - NetworkInterfaceListener, SelfContainedNetworkInterfaceListener, lookup_info_by_addr, + lookup_info_by_addr, NetworkInterfaceListener, SelfContainedNetworkInterfaceListener, }; use crate::net::static_server::{ diagnostic_ui_router, init_ui_router, install_ui_router, main_ui_router, redirecter, refresher, @@ -23,7 +23,7 @@ use crate::net::static_server::{ }; use crate::prelude::*; use crate::util::actor::background::BackgroundJobQueue; -use crate::util::sync::{SyncMutex, SyncRwLock, Watch}; +use crate::util::sync::{SyncRwLock, Watch}; pub struct Accepted { pub https_redirect: bool, @@ -235,23 +235,34 @@ impl WebServer { let handler = async { loop { - if let Err(e) = async { - let accepted = acceptor.accept().await?; - queue.add_job( - graceful.watch( - server - .serve_connection_with_upgrades( - TokioIo::new(accepted.stream), - SwappableRouter(service.clone(), accepted.https_redirect), - ) - .into_owned(), - ), - ); + let mut err = None; + for _ in 0..5 { + if let Err(e) = async { + let accepted = acceptor.accept().await?; + queue.add_job( + graceful.watch( + server + .serve_connection_with_upgrades( + TokioIo::new(accepted.stream), + SwappableRouter( + service.clone(), + accepted.https_redirect, + ), + ) + .into_owned(), + ), + ); - Ok::<_, Error>(()) + Ok::<_, Error>(()) + } + .await + { + err = Some(e); + } else { + break; + } } - .await - { + if let Some(e) = err { tracing::error!("Error accepting HTTP connection: {e}"); tracing::debug!("{e:?}"); } diff --git a/core/startos/src/util/sync.rs b/core/startos/src/util/sync.rs index 405ff1d50..e9d0251eb 100644 --- a/core/startos/src/util/sync.rs +++ b/core/startos/src/util/sync.rs @@ -5,8 +5,8 @@ use std::sync::atomic::AtomicUsize; use std::sync::{Arc, Weak}; use std::task::{Poll, Waker}; -use futures::Stream; use futures::stream::BoxStream; +use futures::Stream; use crate::prelude::*; @@ -51,7 +51,7 @@ where panic!("lock {id} is already locked on this thread"); } let tracer: helpers::NonDetachingJoinHandle<()> = { - let bt = std::backtrace::Backtrace::capture(); + let bt = std::backtrace::Backtrace::force_capture(); tokio::spawn(async move { use std::time::Duration; diff --git a/core/startos/startd.service b/core/startos/startd.service index c40b69a99..6ce17697e 100644 --- a/core/startos/startd.service +++ b/core/startos/startd.service @@ -4,7 +4,6 @@ Description=StartOS Daemon [Service] Type=simple Environment=RUST_LOG=startos=debug,patch_db=warn -Environment=RUST_BACKTRACE=1 ExecStart=/usr/bin/startd Restart=always RestartSec=3