mirror of
https://github.com/Start9Labs/start-os.git
synced 2026-04-04 14:29:45 +00:00
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:
@@ -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?;
|
||||||
|
|
||||||
|
|||||||
@@ -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(),
|
||||||
|
|||||||
Reference in New Issue
Block a user