[pbs-devel] [PATCH proxmox-backup 2/9] file-restore: try to kill VM when stale

Stefan Reiter s.reiter at proxmox.com
Thu May 6 17:26:17 CEST 2021


Helps to clean up a VM that has crashed, is not responding to vsock API
calls, but still has a running QEMU instance.

We always check the process commandline to ensure we don't kill a random
process that took over the PID.

Signed-off-by: Stefan Reiter <s.reiter at proxmox.com>
---
 src/bin/proxmox_file_restore/block_driver_qemu.rs | 2 ++
 src/bin/proxmox_file_restore/qemu_helper.rs       | 2 +-
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/bin/proxmox_file_restore/block_driver_qemu.rs b/src/bin/proxmox_file_restore/block_driver_qemu.rs
index c95bf80b..24f62796 100644
--- a/src/bin/proxmox_file_restore/block_driver_qemu.rs
+++ b/src/bin/proxmox_file_restore/block_driver_qemu.rs
@@ -98,6 +98,7 @@ async fn cleanup_map(map: &mut HashMap<String, VMState>) -> bool {
                 "VM '{}' (pid: {}, cid: {}) was not reachable, removing from map",
                 name, state.pid, state.cid
             );
+            let _ = super::qemu_helper::try_kill_vm(state.pid);
         }
     }
 
@@ -131,6 +132,7 @@ async fn ensure_running(details: &SnapRestoreDetails) -> Result<VsockClient, Err
                 Err(err) => {
                     eprintln!("stale VM detected, restarting ({})", err);
                     // VM is dead, restart
+                    let _ = super::qemu_helper::try_kill_vm(vm.pid);
                     let vms = start_vm(vm.cid, details).await?;
                     new_cid = vms.cid;
                     state.map.insert(name, vms.clone());
diff --git a/src/bin/proxmox_file_restore/qemu_helper.rs b/src/bin/proxmox_file_restore/qemu_helper.rs
index 20b4f344..a2b5b09d 100644
--- a/src/bin/proxmox_file_restore/qemu_helper.rs
+++ b/src/bin/proxmox_file_restore/qemu_helper.rs
@@ -60,7 +60,7 @@ fn validate_img_existance(debug: bool) -> Result<(), Error> {
     Ok(())
 }
 
-fn try_kill_vm(pid: i32) -> Result<(), Error> {
+pub fn try_kill_vm(pid: i32) -> Result<(), Error> {
     let pid = Pid::from_raw(pid);
     if let Ok(()) = kill(pid, None) {
         // process is running (and we could kill it), check if it is actually ours
-- 
2.20.1






More information about the pbs-devel mailing list