aboutsummaryrefslogtreecommitdiff
path: root/src/server/handoff.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/handoff.rs')
-rw-r--r--src/server/handoff.rs36
1 files changed, 31 insertions, 5 deletions
diff --git a/src/server/handoff.rs b/src/server/handoff.rs
index d38bdc29..6dadfdf4 100644
--- a/src/server/handoff.rs
+++ b/src/server/handoff.rs
@@ -9,7 +9,7 @@ use std::os::unix::process::CommandExt;
#[cfg(unix)]
use std::path::{Path, PathBuf};
#[cfg(unix)]
-use std::process::Command;
+use std::process::{Child, Command};
#[cfg(unix)]
use std::time::Duration;
@@ -71,7 +71,7 @@ pub(crate) fn spawn_handoff_import(
import_exe: Option<&Path>,
socket_path: &Path,
token: &str,
-) -> io::Result<u32> {
+) -> io::Result<Child> {
let fallback_exe;
let exe = if let Some(import_exe) = import_exe {
import_exe
@@ -94,7 +94,7 @@ pub(crate) fn spawn_handoff_import(
.stdin(std::process::Stdio::null())
.stdout(std::process::Stdio::null())
.stderr(std::process::Stdio::null());
- let child = command.spawn().map_err(|err| {
+ command.spawn().map_err(|err| {
io::Error::new(
err.kind(),
format!(
@@ -102,8 +102,34 @@ pub(crate) fn spawn_handoff_import(
exe.display()
),
)
- })?;
- Ok(child.id())
+ })
+}
+
+#[cfg(unix)]
+pub(crate) fn cleanup_failed_import_child(child: &mut Child) {
+ let pid = child.id();
+ match child.try_wait() {
+ Ok(Some(status)) => {
+ info!(pid, status = %status, "handoff import server exited during rollback");
+ return;
+ }
+ Ok(None) => {}
+ Err(err) => {
+ warn!(pid, err = %err, "failed to inspect handoff import server before rollback");
+ }
+ }
+
+ if let Err(err) = child.kill() {
+ warn!(pid, err = %err, "failed to kill handoff import server during rollback");
+ }
+ match child.wait() {
+ Ok(status) => {
+ info!(pid, status = %status, "handoff import server reaped during rollback");
+ }
+ Err(err) => {
+ warn!(pid, err = %err, "failed to reap handoff import server during rollback");
+ }
+ }
}
#[cfg(unix)]