On 31.01.2016 12:03, Wido den Hollander wrote:
On 01/31/2016 08:37 AM, Michal Privoznik wrote:
> On 30.01.2016 19:59, Wido den Hollander wrote:
>> Hi,
>>
>> I'm trying to implement the volUpload and volDownload functions for the
>> RBD storage driver but I keep getting this:
>>
>> 2016-01-30 18:56:11.675+0000: 6447: debug :
>> virStorageBackendRBDVolDownload:1395 : Read 4096 bytes at offset 0 from
>> RBD image libvirt/wido1
>>
>> 2016-01-30 18:56:11.675+0000: 6447: debug : virStreamSend:168 :
>> stream=0x7fe780000930, data=0x7fe780062df0, nbytes=4096
>>
>> 2016-01-30 18:56:11.675+0000: 6447: error : virStreamSend:186 : this
>> function is not supported by the connection driver: virStreamSend
>>
>> I reference to the stream with virStreamRef(stream); and then I use
>> virStreamSend() to write data to the stream, but that fails.
>>
>> I've looked through the source and couldn't find anything what might be
>> the issue.
>>
>> Libvirt is running locally on my system and I'm using qemu:///system to
>> connect locally with virsh.
>>
>> Do I need to initialize the stream in any way before I can write data to it?
>
> Interesting, seems like all virStream drivers have implemented Send()
> and Recv() (what's the point in having them if they haven't, right?).
> How are you creating the stream? You know that you need to create the
> stream on both client and server side, right?
>
It's in the storage backend driver, so I assume the stream has already
been created.
This is the code:
https://github.com/wido/libvirt/commit/bbb6403ebd952d7c3f2fba8c60f77087e0...
Oh, slightly unrelated: you should move @buf allocation out of while() -
you need to allocate it only once, not each time per iteration.
static int
virStorageBackendRBDVolDownload(virConnectPtr conn,
virStoragePoolObjPtr pool,
virStorageVolDefPtr vol,
virStreamPtr stream,
unsigned long long offset,
unsigned long long length,
unsigned int flags)
..
..
virStreamRef(stream);
..
..
while (1) {
rbd_read()
virStreamSend(X, stream)
}
And that gives me the error I posted above.
I checked the docs:
https://libvirt.org/html/libvirt-libvirt-stream.html
Couldn't find anything additional about what I needed to do. I assume
the storage driver creates the stream for me.
Actually, it's daemon dispatch function that creates it in
remoteDispatchStorageVolDownload(). Now the question is, what connection
URI you're using and whether it is a remote one (so that the daemon is
involved). If not, you need to create the stream on your own. On the
other hand - I don't know how are you testing this - virsh does create
the stream for you.
What you can do is to set breakpoint at virStreamSend and see what does
@st look like. st->driver should point to actual driver implementation
and you should see it filled with callbacks.
I have no RBD set up to help you more. Sorry.
Michal