[libvirt] any better way to treat device-detach timeout ?

Zhangbo (Oscar) oscar.zhangbo at huawei.com
Fri Mar 11 09:26:23 UTC 2016


After rethinking, I guess there's still a problem:

   Suggest that 
   1 the device got detached in qemu after 10 secs,
   2 the func virDomainDetachDeviceFlags() has already returned success in the 5th second. Libvirt won't wait for the DEVICE_DELETED event after then.
   3 the 'def' has the device untouched
   4 thus, 10 secs later, the device is detached successfully in qemu, but libvirt has the device un-detached in def(transient XML).

   Which means that: libvirt is not correct in device list then, we will fail to attach/detach that device after then.

Oscar.


>>
>>On Fri, Mar 11, 2016 at 07:40:54 +0000, Zhangbo (Oscar) wrote:
>>> Hi,all:
>>>
>>>    I find that we remove devices only after DEVICE_DELETED
>>event.(patch:3fbf78bd).
>>>    And it treats TIMEOUT as success. The detailed codes are shown as
>>below:
>>>         rc = qemuDomainWaitForDeviceRemoval(vm);
>>>         if (rc == 0 || rc == 1)
>>>           ret = qemuDomainRemoveDiskDevice(driver, vm, detach);
>>>         else
>>>           ret = 0;
>>>
>>>
>>>    Here comes the problem:
>>>    If
>>>    1. We pass
>>flags=3(VIR_DOMAIN_AFFECT_LIVE|VIR_DOMAIN_AFFECT_CONFIG) to
>>virDomainDetachDeviceFlags,
>>>    2. It timed out to receive DEVICE_DELETED event,
>>virDomainDetachDeviceFlags api will return 0(succeed).
>>>      Please be aware that:  vm->newdef(persistent) removes the device
>>while vm->def(transient) keeps it untouched.
>>>    3. Then we try to attach the same device with flag 3, because it differs in
>>newDef and def, the API virDomainDetachDeviceFlags() returns ERROR.
>>>      Consequent attach/detach jobs all fail after then.
>>>
>>>    So, shall we make it return FAIL when it fails in
>>qemuDomainWaitForDeviceRemoval()?
>>
>>No.
>>
>>> Or just remove the device in def after we get the DEVICE_DELETED event?
>>
>>Yes, and we already do that. The API is explicitly documented as a
>>request to detach a device. It returns 0 when this request was
>>successfully passed to the guest OS. Some devices (e.g., USB devices)
>>are detached immediately, but others may require guest cooperation and
>>may take long time to detach or the guest may even completely ignore the
>>request. Thus, once virDomainDetachDeviceFlags returns 0, you need to
>>either periodically check the active XML to see if the device was
>>removed or you can register a callback for
>>VIR_DOMAIN_EVENT_ID_DEVICE_REMOVED event which is emitted when
>
>I got it! Thanks!
>
>>libvirt
>>really removes the device from the domain (after getting DEVICE_DELETED
>>from QEMU).
>>
>>Jirka
>>
>>--
>
>--
>libvir-list mailing list
>libvir-list at redhat.com
>https://www.redhat.com/mailman/listinfo/libvir-list




More information about the libvir-list mailing list