[libvirt] virStream: this function is not supported by the connection driver
Wido den Hollander
wido at widodh.nl
Mon Feb 1 13:27:14 UTC 2016
> Op 1 februari 2016 om 14:11 schreef Michal Privoznik <mprivozn at redhat.com>:
>
>
> 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
More information about the libvir-list
mailing list