[libvirt] [PATCH 00/11] Generic data stream handling
Daniel P. Berrange
berrange at redhat.com
Thu Sep 17 14:29:55 UTC 2009
On Tue, Sep 15, 2009 at 02:35:02PM +0200, Chris Lalancette wrote:
> Daniel P. Berrange wrote:
> > The immediate use case for this data stream code is Chris' QEMU
> > migration patchset.
> >
> > The next use case is to allow serial console access to be tunnelled
> > over libvirtd, eg to make 'virsh console GUEST' work remotely.
> > This use case is why I included the support for non-blocking data
> > streams and event loop integration (not required for Chris'
> > migration use case)
> >
> > Anyway, assuming Chris confirms that I've not broken his code, then
> > patches 1-6 are targetted for this next release.
>
> I'm sorry for the very long delay in getting back to this. I've been playing
> around with my tunnelled migration patches on top of this code, and I just can't
> seem to make the new nonblocking stuff work properly. I'm getting a couple of
> behaviors that are highly undesirable:
>
> 1) Immediately after starting the stream, I get a virStreamRecv() callback on
> the destination side. The problem is that this is wrong for migration; there's
> no data that I can read *from* the destination qemu process which makes any
> sense. While I could implement the method and just throw away the data, that
> doesn't seem right to me. This leads to...
I realize this is due to the remoteAddClientStream() method in
qemud/stream.c. It unconditionally sets 'stream->tx' to 1. I
didn't notice the problem myself, since the test driver is using
pipes which are unidirectional, but yor UNIX domain socket is
bi-directional.
We could either add a flag to remoteAddClientStream() to indicate
whether the stream should allow read or write or both. Or you
might be able to call shutdown(sockfd, SHUT_RD) on your UNIX
socket to indicate that its only going to be used for write
effectively making it unidirectional.
A 3rd option is to define more flags for virStreamNew(), one for
READ, one for WRITE, and have the remote daemon pay attention to
these
> 2) A crash in libvirtd on the source side of the destination. It doesn't
> happen every single time, but when it has happened I've traced it down to the
> fact that src/remote_internal.c:remoteDomainEventFired() can get called *after*
> conn->privateData has been set to NULL, leading to a SEGV on NULL pointer
> dereference. I can provide a core-dump for this if needed.
I don't have any explanation for this - its a little wierd and we ought
to try and figure it out if possible.
> 3) (minor) The python bindings refuse to build with these patches in place.
Yeah I completely forgot to add rules for virSecret APIs there
Daniel
--
|: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :|
|: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|
More information about the libvir-list
mailing list