feat: top-level panic recovery mechanism
This commit is contained in:
parent
e7caac4dd7
commit
430ba54185
1 changed files with 21 additions and 4 deletions
21
src/main.rs
21
src/main.rs
|
@ -51,10 +51,27 @@ async fn main() -> Result<()> {
|
||||||
let ssh_socket_addr = SSH_SOCKET_ADDR.ok_or(eyre!("Invalid host IP provided"))?;
|
let ssh_socket_addr = SSH_SOCKET_ADDR.ok_or(eyre!("Invalid host IP provided"))?;
|
||||||
let web_server_addr = WEB_SERVER_ADDR.ok_or(eyre!("Invalid host IP provided"))?;
|
let web_server_addr = WEB_SERVER_ADDR.ok_or(eyre!("Invalid host IP provided"))?;
|
||||||
|
|
||||||
let ssh_config = tokio::task::block_in_place(ssh_config);
|
let local_set = tokio::task::LocalSet::new();
|
||||||
|
loop {
|
||||||
|
let task = local_set.run_until(async {
|
||||||
|
tokio::task::spawn_local(async move {
|
||||||
|
let ssh_config = ssh_config();
|
||||||
tokio::select! {
|
tokio::select! {
|
||||||
ssh_res = SshServer::start(ssh_socket_addr, ssh_config) => ssh_res,
|
ssh_res = SshServer::start(ssh_socket_addr, ssh_config) => ssh_res,
|
||||||
web_res = WebLandingServer::start(web_server_addr) => web_res.map_err(|err| eyre!(err)),
|
web_res = WebLandingServer::start(web_server_addr) => web_res.map_err(|err| eyre!(err))
|
||||||
|
}
|
||||||
|
}).await
|
||||||
|
});
|
||||||
|
|
||||||
|
match task.await {
|
||||||
|
Ok(res) => break res,
|
||||||
|
Err(err) => {
|
||||||
|
if err.is_panic() {
|
||||||
|
tracing::error!("Application panicked, recovering...");
|
||||||
|
std::panic::resume_unwind(err.into_panic());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue