mirror of
https://github.com/Start9Labs/start-os.git
synced 2026-03-26 02:11:53 +00:00
fix stack overflow on shutdown (#2208)
This commit is contained in:
4
Makefile
4
Makefile
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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(())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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() });
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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))]
|
||||||
|
|||||||
Reference in New Issue
Block a user