[libvirt] [PATCH 00/11] Generic data stream handling
Daniel P. Berrange
berrange at redhat.com
Tue Sep 29 14:46:13 UTC 2009
FYI,
the data streams patches are now committed
Daniel
On Fri, Sep 25, 2009 at 09:58:51AM +0200, Daniel Veillard wrote:
> On Mon, Aug 24, 2009 at 09:51:03PM +0100, Daniel P. Berrange wrote:
> > The following series of patches introduce support for generic data
> > streams in the libvirt API, the remote protocol, client & daemon.
> >
> > The public API takes the form of a new object virStreamPtr and
> > methods to read/write/close it
> >
> > The remote protocol was the main hard bit. Since the protocol
> > allows multiple concurrent API calls on a single connection,
> > this needed to also allow concurrent data streams. It is also
> > not acceptable for a large data stream to block other traffic
> > while it is transferring.
> >
> > Thus, we introduce a new protocol message type 'REMOTE_STREAM'
> > to handle transfer for the stream data. A method involving a
> > data streams starts off in the normal way with a REMOTE_CALL
> > to the server, and a REMOTE_REPLY response message. If this
> > was successful, there now follows the data stream traffic.
> >
> > For outgoing streams (data from client to server), the client
> > will send zero or more REMOTE_STREAM packets containing the
> > data with status == REMOTE_CONTINUE. These are asynchronous
> > and not acknowledged by the server. At any time the server
> > may send an async message with a type of REMOTE_STREAM and
> > status of REMOTE_ERROR. This indicates to the client that the
> > transfer is aborting at server request. If the client wishes
> > to abort, it can send the server a REMOTE_STREAM+REMOTE_ERROR
> > message. If the client finishes its data transfer, it will
> > send a final REMOTE_STREAM+REMOTE_OK message, and the server
> > will respond with the same. This full roundtrip handshake
> > ensures any async error messages are guarenteed to be flushed
> >
> > For incoming data streams (data from server to client), the
> > server sends zero or more REMOTE_STREAM packets containing the
> > data with status == REMOTE_CONTINUE. These are asynchronous
> > and not acknowledged by the client. At any time the client
> > may send an async message with a type of REMOTE_STREAM and
> > status of REMOTE_ERROR. This indicates to the server that the
> > transfer is aborting at client request. If the server wishes
> > to abort, it can send the server a REMOTE_STREAM+REMOTE_ERROR
> > message. When the server finishes its data transfer, it will
> > send a final REMOTE_STREAM+REMOTE_CONTINUE message ewith a
> > data length of zero (ie EOF). The client will then send a
> > REMOTE_STREAM+REMOTE_OK packet and the server will respond
> > with the same. This full roundtrip handshake ensures any async
> > error messages are guarenteed to be flushed
> >
> > This all ensures that multiple data streams can be active in
> > parallel, and with a maximum data packet size of 256 KB, no
> > single stream can cause too much latency on the connection for
> > other API calls/streams.
>
> Okay, this is very similar in principle with HTTP pipelining
> with IMHO the same benefits and the same potential drawbacks.
> A couple of things to check might be:
> - the maximum amount of concurrent active streams allowed,
> for example suppose you want to migrate in emergency
> all the domains out of a failing machine, some level of
> serialization may be better than say attempting to migrate
> all 100 domains at the same time. 10 parallel stream might
> be better, but we need to make sure the API allows to report
> such condition.
> - the maximum chunking size, but with 256k I think this is
> covered.
> - synchronization internally between threads to avoid deadlocks
> or poor performances, that can be very hard to debug, so I
> guess an effort should be provided to explain how things are
> designed internally.
>
> But this sounds fine in general.
>
> > The only thing it does not allow for is one API method to use
> > two or more streams. These may be famous last words, but I
> > don't think that use case will be neccessary for any of our
> > APIs...
>
> as long as the limitation is documented especially in the parts
> of teh code where the assumption is made, sounds fine.
>
> > The last 5 patches with a subject of [DEMO] are *NOT* intended
> > to be committed to the repository. They merely demonstrate the
> > use of data streams for a couple of hypothetical file upload
> > and download APIs. Actually they were mostly to allow me to
> > test the code streams code without messing around with the QEMU
> > migration code.
> >
> > 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)
>
> Okay, next to individual patches reviews,
>
> Daniel
>
> --
> Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/
> daniel at veillard.com | Rpmfind RPM search engine http://rpmfind.net/
> http://veillard.com/ | virtualization library http://libvirt.org/
--
|: 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