apache / apache/cloudstack

[KVM] Restored backup volume not attached to running VM via libvirt - only database updated

Aperta
#12,405 3 commenti 3 reazioni 0 assegnatari Vedi su GitHub
status:needs-reproducing
Lingua principale
Java
Stelle
3.1k
Fork
1.4k
Merge medio
6g 19h
PR unite (30g)
32

Descrizione

### 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.

Guida per i contributori

Apri la guida per i contributori

Direzione di ricerca

Iniziate da KVMGuru.attachRestoredVolumeToVirtualMachine(), in particolare dalle righe citate, e confrontate il relativo collegamento al database con il normale percorso dell’API attachVolume. Leggete la gestione dello stato di esecuzione in LibvirtComputingResource e il flusso di AttachCommand. Riproducete restoreVolumeFromBackupAndAttachToVM con una VM in esecuzione, quindi verificate che il disco ripristinato compaia in virsh domblklist e nel guest senza riavviare.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
java
Ambito
backend, infrastructure
Tipo di issue
Bug
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Ferma
Chiarezza
Specificata chiaramente
Idoneità per principianti
45/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.