add dedicated error for spawn_server
- add `SpawnServerError` type with thiserror
This commit is contained in:
parent
04f58fcb93
commit
45ba5e2c71
1 changed files with 39 additions and 10 deletions
|
@ -36,6 +36,7 @@ use smol::Async;
|
||||||
use smol::{net::unix::UnixListener, stream::StreamExt as _};
|
use smol::{net::unix::UnixListener, stream::StreamExt as _};
|
||||||
use std::ffi::OsStr;
|
use std::ffi::OsStr;
|
||||||
use std::ops::ControlFlow;
|
use std::ops::ControlFlow;
|
||||||
|
use std::process::ExitStatus;
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
use std::sync::LazyLock;
|
use std::sync::LazyLock;
|
||||||
use std::{env, thread};
|
use std::{env, thread};
|
||||||
|
@ -690,18 +691,39 @@ fn kill_running_server(pid: u32, paths: &ServerPaths) -> Result<()> {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn spawn_server(paths: &ServerPaths) -> Result<()> {
|
#[derive(Debug, Error)]
|
||||||
|
pub(crate) enum SpawnServerError {
|
||||||
|
#[error("failed to remove stdin socket")]
|
||||||
|
RemoveStdinSocket(#[source] std::io::Error),
|
||||||
|
|
||||||
|
#[error("failed to remove stdout socket")]
|
||||||
|
RemoveStdoutSocket(#[source] std::io::Error),
|
||||||
|
|
||||||
|
#[error("failed to remove stderr socket")]
|
||||||
|
RemoveStderrSocket(#[source] std::io::Error),
|
||||||
|
|
||||||
|
#[error("failed to get current_exe")]
|
||||||
|
CurrentExe(#[source] std::io::Error),
|
||||||
|
|
||||||
|
#[error("failed to launch server process")]
|
||||||
|
ProcessStatus(#[source] std::io::Error),
|
||||||
|
|
||||||
|
#[error("failed to launch and detach server process: {status}\n{paths}")]
|
||||||
|
LaunchStatus { status: ExitStatus, paths: String },
|
||||||
|
}
|
||||||
|
|
||||||
|
fn spawn_server(paths: &ServerPaths) -> Result<(), SpawnServerError> {
|
||||||
if paths.stdin_socket.exists() {
|
if paths.stdin_socket.exists() {
|
||||||
std::fs::remove_file(&paths.stdin_socket)?;
|
std::fs::remove_file(&paths.stdin_socket).map_err(SpawnServerError::RemoveStdinSocket)?;
|
||||||
}
|
}
|
||||||
if paths.stdout_socket.exists() {
|
if paths.stdout_socket.exists() {
|
||||||
std::fs::remove_file(&paths.stdout_socket)?;
|
std::fs::remove_file(&paths.stdout_socket).map_err(SpawnServerError::RemoveStdoutSocket)?;
|
||||||
}
|
}
|
||||||
if paths.stderr_socket.exists() {
|
if paths.stderr_socket.exists() {
|
||||||
std::fs::remove_file(&paths.stderr_socket)?;
|
std::fs::remove_file(&paths.stderr_socket).map_err(SpawnServerError::RemoveStderrSocket)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
let binary_name = std::env::current_exe()?;
|
let binary_name = std::env::current_exe().map_err(SpawnServerError::CurrentExe)?;
|
||||||
let mut server_process = std::process::Command::new(binary_name);
|
let mut server_process = std::process::Command::new(binary_name);
|
||||||
server_process
|
server_process
|
||||||
.arg("run")
|
.arg("run")
|
||||||
|
@ -718,11 +740,18 @@ fn spawn_server(paths: &ServerPaths) -> Result<()> {
|
||||||
|
|
||||||
let status = server_process
|
let status = server_process
|
||||||
.status()
|
.status()
|
||||||
.context("failed to launch server process")?;
|
.map_err(SpawnServerError::ProcessStatus)?;
|
||||||
anyhow::ensure!(
|
|
||||||
status.success(),
|
if !status.success() {
|
||||||
"failed to launch and detach server process"
|
return Err(SpawnServerError::LaunchStatus {
|
||||||
);
|
status,
|
||||||
|
paths: format!(
|
||||||
|
"log file: {}, pid file: {}",
|
||||||
|
paths.log_file.display(),
|
||||||
|
paths.pid_file.display()
|
||||||
|
),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
let mut total_time_waited = std::time::Duration::from_secs(0);
|
let mut total_time_waited = std::time::Duration::from_secs(0);
|
||||||
let wait_duration = std::time::Duration::from_millis(20);
|
let wait_duration = std::time::Duration::from_millis(20);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue