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),) ifeq ($(REMOTE),)
mkdir = mkdir -p $1 mkdir = mkdir -p $1
rm = rm -rf $@ rm = rm -rf $1
cp = cp -r $1 $2 cp = cp -r $1 $2
else else
mkdir = ssh $(REMOTE) 'mkdir -p $1' mkdir = ssh $(REMOTE) 'mkdir -p $1'
rm = ssh $(REMOTE) 'rm -rf $@' rm = ssh $(REMOTE) 'sudo rm -rf $1'
define cp define cp
tar --transform "s|^$1|x|" -czv -f- $1 | ssh $(REMOTE) "sudo tar --transform 's|^x|$2|' -xzv -f- -C /" tar --transform "s|^$1|x|" -czv -f- $1 | ssh $(REMOTE) "sudo tar --transform 's|^x|$2|' -xzv -f- -C /"
endef endef

View File

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

View File

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

View File

@@ -329,6 +329,7 @@ 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 {
Err(Error::new( Err(Error::new(
@@ -341,11 +342,13 @@ 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) {
tracing::debug!("Dropping NetService for {}", self.id);
let svc = std::mem::replace( let svc = std::mem::replace(
self, self,
NetService { NetService {
id: Default::default(), id: Default::default(),
ip: [0, 0, 0, 0].into(), ip: Ipv4Addr::new(0, 0, 0, 0),
dns: Default::default(), dns: Default::default(),
controller: Default::default(), controller: Default::default(),
tor: Default::default(), tor: Default::default(),
@@ -354,4 +357,5 @@ impl Drop for NetService {
); );
tokio::spawn(async move { svc.remove_all().await.unwrap() }); tokio::spawn(async move { svc.remove_all().await.unwrap() });
} }
}
} }

View File

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