[libvirt-users] stream finish throws exception via python API

Cole Robinson crobinso at redhat.com
Tue Apr 26 13:37:30 UTC 2016


On 04/26/2016 09:35 AM, Shahar Havivi wrote:
> On 26.04.16 15:30, Shahar Havivi wrote:
>> On 26.04.16 14:14, Shahar Havivi wrote:
>>> On 25.04.16 09:11, Cole Robinson wrote:
>>>> On 04/25/2016 08:10 AM, Shahar Havivi wrote:
>>>>> On 17.04.16 15:41, Shahar Havivi wrote:
>>>>>> Hi,
>>>>>> The following snippet works fine e.g. receiving the data but when calling
>>>>>> stream.finish() we get the following error:
>>>>>>
>>>>>> stream = con.newStream()
>>>>>> vol.download(stream, 0, 0, 0)
>>>>>> buf = stream.recv(1024)
>>>>>> stream.finish()
>>>>>>
>>>>>> libvirt: I/O Stream Utils error : internal error: I/O helper exited abnormally
>>>>>> Traceback (most recent call last):
>>>>>>   File "./helpers/kvm2ovirt", line 149, in <module>
>>>>>>     download_volume(vol, item[1], diskno, disksitems, pksize)
>>>>>>   File "./helpers/kvm2ovirt", line 102, in download_volume
>>>>>>     stream.finish()
>>>>>>   File "/usr/lib64/python2.7/site-packages/libvirt.py", line 5501, in finish
>>>>>>     if ret == -1: raise libvirtError ('virStreamFinish() failed')
>>>>>> libvirt.libvirtError: internal error: I/O helper exited abnormally
>>>>>>  
>>>>
>>>> The error message sucks, I'll send patches to improve it a little at least.
>>>>
>>>> What's happening here is that the you haven't read all the data you requested
>>>> (it's vol.download(path, offset, length, flags), length == 0 means read the
>>>> whole file which I suspect you haven't done). In this case the iohelper
>>>> program that libvirt uses won't complete feeding us all the data, and it exits
>>>> with SIGPIPE when we close the read end of the pipe.
>>>>
>>>> Now whether that should actually be an error condition is open to debate.
>>>> virStreamFinish docs make it sound like it's legitimate to throw an error if
>>>> it appears that all requested data wasn't read.
>>> Thanks checking...
>> Thanks Cole,
>> I modify our script and for checking if stream.recv() returns zero the finish
>> works fine.
>> Our API needs to know the size of bytes that you are going to stream back
>> which is not provided by the allocation and capacity.
>> (ie the same as du -s /path/to/disk)
>>
>>   Shahar.
> We need the size of the image "Image end offset" you get from "qemu-img check",
> Does libvirt have an API for that?
> 

Libvirt doesn't invoke qemu-img check anywhere AFAIK, so if that's the only
way to get that info, then it isn't available

- Cole




More information about the libvirt-users mailing list