From 8550e5ad866ae725ddab0ae278fdc4aec40a61fc Mon Sep 17 00:00:00 2001 From: jmsperu Date: Fri, 20 Mar 2026 22:35:37 +0300 Subject: [PATCH] KVM NAS backup: resume VM and exit on backup failure Fix three bugs in nasbackup.sh that caused VMs to remain paused indefinitely when backup jobs fail (e.g. storage full): 1. Add exit after cleanup on Failed backup job status to prevent infinite polling loop in backup_running_vm() 2. Add exit after cleanup on qemu-img convert failure in backup_stopped_vm() to stop processing subsequent disks 3. Add VM state check and virsh resume to cleanup() so paused VMs are automatically resumed after backup failure Fixes #12821 --- scripts/vm/hypervisor/kvm/nasbackup.sh | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/scripts/vm/hypervisor/kvm/nasbackup.sh b/scripts/vm/hypervisor/kvm/nasbackup.sh index e298006f7a8c..9ad1f7434bca 100755 --- a/scripts/vm/hypervisor/kvm/nasbackup.sh +++ b/scripts/vm/hypervisor/kvm/nasbackup.sh @@ -141,7 +141,8 @@ backup_running_vm() { break ;; Failed) echo "Virsh backup job failed" - cleanup ;; + cleanup + exit 1 ;; esac sleep 5 done @@ -177,6 +178,7 @@ backup_stopped_vm() { if ! qemu-img convert -O qcow2 "$disk" "$output" > "$logFile" 2> >(cat >&2); then echo "qemu-img convert failed for $disk $output" cleanup + exit 1 fi name="datadisk" done @@ -221,6 +223,20 @@ mount_operation() { cleanup() { local status=0 + # Resume the VM if it was paused (e.g. by virsh backup-begin) + if [[ -n "$VM" ]]; then + local vm_state + vm_state=$(virsh -c qemu:///system domstate "$VM" 2>/dev/null) + if [[ "$vm_state" == "paused" ]]; then + if virsh -c qemu:///system resume "$VM" > /dev/null 2>&1; then + log -ne "Resumed VM $VM after backup failure" + else + echo "Failed to resume VM $VM - manual intervention required (virsh resume $VM)" + status=1 + fi + fi + fi + rm -rf "$dest" || { echo "Failed to delete $dest"; status=1; } umount "$mount_point" || { echo "Failed to unmount $mount_point"; status=1; } rmdir "$mount_point" || { echo "Failed to remove mount point $mount_point"; status=1; }