> Op 1 februari 2016 om 14:11 schreef Michal Privoznik <mprivozn@xxxxxxxxxx>: > > > 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/bbb6403ebd952d7c3f2fba8c60f77087e06a2a22 > > Oh, slightly unrelated: you should move @buf allocation out of while() - > you need to allocate it only once, not each time per iteration. > Thanks, I'll take a look at that as well. > > > > 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. > Simple, it's my local system running libvirtd: $ env LIBVIRT_DEBUG=1 ./run ./daemon/libvirtd -f libvirtd.conf -v > libvirt.log 2>&1 Afterwards I run: $ ./tools/virsh pool-start rbdpool $ ./tools/virsh vol-download libvirt/myvolume /tmp/myvolume In that case the stream should have been created by virsh, right? > 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. > Good point, I'll look at that as well. > I have no RBD set up to help you more. Sorry. > Np. This doesn't seem RBD related, but mainly virStream. Wido > Michal -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list