[KVM] Restored backup volume not attached to running VM via libvirt - only database updated
- Dominant language
- Java
- Stars
- 3.1k
- Forks
- 1.4k
- Avg merge
- 6d 19h
- Merged PRs (30d)
- 32
Description
### problem
## Description
When restoring a volume from backup and attaching it to a **running** KVM VM, the volume is only attached at the **database level** but not actually hot-attached to the running VM via libvirt. This means:
1. The volume appears in CloudStack UI as "attached"
2. The volume does NOT appear in `virsh domblklist `
3. The volume is NOT visible inside the guest OS
4. User must reboot(forced) the VM to see the restored volume
## Root Cause
In `KVMGuru.attachRestoredVolumeToVirtualMachine()` (line 380-400), the method only:
- Updates the volume state in the database via `_volumeDao.attachVolume()`
- Sets volume state to `Ready`
It does **NOT**:
- Check if VM is running
- Send an `AttachCommand` to the KVM agent to hot-attach the disk via libvirt
## Expected Behavior
When attaching a restored volume to a **running** VM:
1. CloudStack should detect the VM state
2. If VM is [Running](cci:1://file:///root/new_merge/olympos-cloud-platform/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java:5982:4-5991:5), send a libvirt attach command to hot-attach the disk
3. Volume should immediately appear in `virsh domblklist` and inside guest OS
4. No reboot should be required
### versions
CloudStack: 4.21.0
Hypervisor: KVM
Host OS: Rocky Linux 9
Guest OS: Rocky Linux 9 / Windows 10 - 2022 Server
### The steps to reproduce the bug
## Steps to Reproduce
1. Create a VM with a data disk
2. Create a backup of the VM
3. Start the VM (ensure it's running)
4. Restore the backed-up volume and attach to the running VM via API:
`restoreVolumeFromBackupAndAttachToVM`
5. Check `virsh domblklist ` on the KVM host
6. **Observe:** The restored volume is NOT listed
7. Check inside guest OS
8. **Observe:** The disk is NOT visible
9. Reboot(forced) the VM
10. **Observe:** After reboot(forced), the disk appears
### What to do about it?
Either:
A) Add hot-attach logic to `KVMGuru.attachRestoredVolumeToVirtualMachine()` to send `AttachCommand` when VM is running
B) Or document this as expected behavior and require users to stop VM before restoring volumes
Option A is preferred as it aligns with how regular [attachVolume](cci:1://file:///root/new_merge/olympos-cloud-platform/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java:2479:4-2483:5) API works for running VMs.
Contributor guide
Research direction
Start in KVMGuru.attachRestoredVolumeToVirtualMachine(), especially the cited lines, and compare its database attachment with the regular attachVolume API path. Read the running-state handling in LibvirtComputingResource and the AttachCommand flow. Reproduce restoreVolumeFromBackupAndAttachToVM with a running VM, then verify the restored disk appears in virsh domblklist and the guest without a reboot.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- java
- Domain
- backend, infrastructure
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Clearly specified
- Newbie friendliness
- 45/100