prevent stack overflow on shutdown (#2440)

* prevent stack overflow on shutdown

* fix

---------

Co-authored-by: J H <2364004+Blu-J@users.noreply.github.com>
This commit is contained in:
Aiden McClelland
2023-10-04 13:51:58 -06:00
committed by GitHub
parent 05d6aea37f
commit 20241c27ee
2 changed files with 10 additions and 5 deletions

View File

@@ -16,7 +16,7 @@ use crate::{Error, ErrorKind, ResultExt};
#[instrument(skip_all)] #[instrument(skip_all)]
async fn inner_main(cfg_path: Option<PathBuf>) -> Result<Option<Shutdown>, Error> { async fn inner_main(cfg_path: Option<PathBuf>) -> Result<Option<Shutdown>, Error> {
let (rpc_ctx, server, shutdown) = { let (rpc_ctx, server, shutdown) = async {
let rpc_ctx = RpcContext::init( let rpc_ctx = RpcContext::init(
cfg_path, cfg_path,
Arc::new( Arc::new(
@@ -91,8 +91,9 @@ async fn inner_main(cfg_path: Option<PathBuf>) -> Result<Option<Shutdown>, Error
sig_handler.abort(); sig_handler.abort();
(rpc_ctx, server, shutdown) Ok::<_, Error>((rpc_ctx, server, shutdown))
}; }
.await?;
server.shutdown().await; server.shutdown().await;
rpc_ctx.shutdown().await?; rpc_ctx.shutdown().await?;

View File

@@ -154,6 +154,7 @@ impl NetController {
let dns = self.dns.add(Some(package.clone()), ip).await?; let dns = self.dns.add(Some(package.clone()), ip).await?;
Ok(NetService { Ok(NetService {
shutdown: false,
id: package, id: package,
ip, ip,
dns, dns,
@@ -210,6 +211,7 @@ impl NetController {
} }
pub struct NetService { pub struct NetService {
shutdown: bool,
id: PackageId, id: PackageId,
ip: Ipv4Addr, ip: Ipv4Addr,
dns: Arc<()>, dns: Arc<()>,
@@ -323,6 +325,7 @@ impl NetService {
Ok(()) Ok(())
} }
pub async fn remove_all(mut self) -> Result<(), Error> { pub async fn remove_all(mut self) -> Result<(), Error> {
self.shutdown = true;
let mut errors = ErrorCollection::new(); let mut errors = ErrorCollection::new();
if let Some(ctrl) = Weak::upgrade(&self.controller) { if let Some(ctrl) = Weak::upgrade(&self.controller) {
for ((_, external), (key, rcs)) in std::mem::take(&mut self.lan) { for ((_, external), (key, rcs)) in std::mem::take(&mut self.lan) {
@@ -333,9 +336,9 @@ impl NetService {
} }
std::mem::take(&mut self.dns); std::mem::take(&mut self.dns);
errors.handle(ctrl.dns.gc(Some(self.id.clone()), self.ip).await); errors.handle(ctrl.dns.gc(Some(self.id.clone()), self.ip).await);
self.ip = Ipv4Addr::new(0, 0, 0, 0);
errors.into_result() errors.into_result()
} else { } else {
tracing::warn!("NetService dropped after NetController is shutdown");
Err(Error::new( Err(Error::new(
eyre!("NetController is shutdown"), eyre!("NetController is shutdown"),
crate::ErrorKind::Network, crate::ErrorKind::Network,
@@ -346,11 +349,12 @@ impl NetService {
impl Drop for NetService { impl Drop for NetService {
fn drop(&mut self) { fn drop(&mut self) {
if self.ip != Ipv4Addr::new(0, 0, 0, 0) { if !self.shutdown {
tracing::debug!("Dropping NetService for {}", self.id); tracing::debug!("Dropping NetService for {}", self.id);
let svc = std::mem::replace( let svc = std::mem::replace(
self, self,
NetService { NetService {
shutdown: true,
id: Default::default(), id: Default::default(),
ip: Ipv4Addr::new(0, 0, 0, 0), ip: Ipv4Addr::new(0, 0, 0, 0),
dns: Default::default(), dns: Default::default(),