fix stack overflow on shutdown (#2208)

This commit is contained in:
Aiden McClelland
2023-03-13 12:13:14 -06:00
committed by GitHub
parent 2f6ebd16c1
commit 7867411095
5 changed files with 40 additions and 28 deletions

View File

@@ -23,11 +23,11 @@ ALL_TARGETS := $(EMBASSY_BINS) system-images/compat/docker-images/$(ARCH).tar sy
ifeq ($(REMOTE),)
mkdir = mkdir -p $1
rm = rm -rf $@
rm = rm -rf $1
cp = cp -r $1 $2
else
mkdir = ssh $(REMOTE) 'mkdir -p $1'
rm = ssh $(REMOTE) 'rm -rf $@'
rm = ssh $(REMOTE) 'sudo rm -rf $1'
define cp
tar --transform "s|^$1|x|" -czv -f- $1 | ssh $(REMOTE) "sudo tar --transform 's|^x|$2|' -xzv -f- -C /"
endef

View File

@@ -90,6 +90,8 @@ async fn inner_main(cfg_path: Option<PathBuf>) -> Result<Option<Shutdown>, Error
server.shutdown().await;
rpc_ctx.shutdown().await?;
tracing::info!("RPC Context is dropped");
Ok(shutdown)
}

View File

@@ -265,6 +265,7 @@ impl RpcContext {
self.managers.empty().await?;
self.secret_store.close().await;
self.is_closed.store(true, Ordering::SeqCst);
tracing::info!("RPC Context is shutdown");
// TODO: shutdown http servers
Ok(())
}

View File

@@ -329,6 +329,7 @@ impl NetService {
}
std::mem::take(&mut self.dns);
errors.handle(ctrl.dns.gc(Some(self.id.clone()), self.ip).await);
self.ip = Ipv4Addr::new(0, 0, 0, 0);
errors.into_result()
} else {
Err(Error::new(
@@ -341,11 +342,13 @@ impl NetService {
impl Drop for NetService {
fn drop(&mut self) {
if self.ip != Ipv4Addr::new(0, 0, 0, 0) {
tracing::debug!("Dropping NetService for {}", self.id);
let svc = std::mem::replace(
self,
NetService {
id: Default::default(),
ip: [0, 0, 0, 0].into(),
ip: Ipv4Addr::new(0, 0, 0, 0),
dns: Default::default(),
controller: Default::default(),
tor: Default::default(),
@@ -354,4 +357,5 @@ impl Drop for NetService {
);
tokio::spawn(async move { svc.remove_all().await.unwrap() });
}
}
}

View File

@@ -21,6 +21,12 @@ impl Shutdown {
pub fn execute(&self) {
use std::process::Command;
if self.restart {
tracing::info!("Beginning server restart");
} else {
tracing::info!("Beginning server shutdown");
}
let rt = tokio::runtime::Builder::new_current_thread()
.enable_all()
.build()
@@ -52,25 +58,23 @@ impl Shutdown {
tracing::debug!("{:?}", e);
}
}
if self.restart {
if !*IS_RASPBERRY_PI || self.restart {
if let Err(e) = SHUTDOWN.play().await {
tracing::error!("Error Playing Shutdown Song: {}", e);
tracing::debug!("{:?}", e);
}
} else {
tokio::fs::write(STANDBY_MODE_PATH, "").await.unwrap();
Command::new("sync")
.invoke(ErrorKind::Filesystem)
.await
.unwrap();
}
});
drop(rt);
if *IS_RASPBERRY_PI {
if !self.restart {
std::fs::write(STANDBY_MODE_PATH, "").unwrap();
Command::new("sync").spawn().unwrap().wait().unwrap();
}
Command::new("reboot").spawn().unwrap().wait().unwrap();
} else {
if self.restart {
Command::new("reboot").spawn().unwrap().wait().unwrap();
} else {
Command::new("shutdown")
.arg("-h")
@@ -81,6 +85,7 @@ impl Shutdown {
.unwrap();
}
}
}
}
#[command(display(display_none))]