[libvirt] [PATCH 04/11] Handle incoming data streams in libvirtd
Daniel Veillard
veillard at redhat.com
Fri Sep 25 10:32:49 UTC 2009
On Mon, Aug 24, 2009 at 09:51:07PM +0100, Daniel P. Berrange wrote:
> * qemud/stream.c: Handle incoming stream data packets, queuing until
> stream becomes writable. Handle stream completion handshake
> * po/POTFILES.in: Add qemud/stream.c
[...]
> +/*
> + * Callback that gets invoked when a stream becomes writable/readable
> + */
> +static void
> +remoteStreamEvent(virStreamPtr st, int events, void *opaque)
> +{
> + struct qemud_client *client = opaque;
> + struct qemud_client_stream *stream;
> +
> + /* XXX sub-optimal - we really should be taking the server lock
> + * first, but we have no handle to the server object
> + * We're lucky to get away with it for now, due to this callback
> + * executing in the main thread, but this should really be fixed
> + */
> + virMutexLock(&client->lock);
Shouldn't the stream stucture carry a reference to the
connection/server ?
[...]
> static int
> -remoteStreamFilter(struct qemud_client *client ATTRIBUTE_UNUSED,
> - struct qemud_client_message *msg ATTRIBUTE_UNUSED,
> - void *opaque ATTRIBUTE_UNUSED)
> +remoteStreamFilter(struct qemud_client *client,
> + struct qemud_client_message *msg, void *opaque)
> {
> + struct qemud_client_stream *stream = opaque;
> +
> + if (msg->hdr.serial == stream->serial &&
> + msg->hdr.proc == stream->procedure &&
> + msg->hdr.type == REMOTE_STREAM) {
> + DEBUG("Incoming rx=%p serial=%d proc=%d status=%d",
> + stream->rx, msg->hdr.proc, msg->hdr.serial, msg->hdr.status);
> +
> + /* If there are queued packets, we need to queue all further
> + * messages, since they must be processed strictly in order.
> + * If there are no queued packets, then OK/ERROR messages
> + * should be processed immediately. Data packets are still
> + * queued to only be processed when the stream is marked as
> + * writable.
> + */
Since we are already separating different classes of packets, why not
extend this to provide 2-3 classes for the data too: BACKGROUND/NORMAL/URGENT
that can be added later using the current flags for creating a stream.
ACK, though this need much testing, ideally we can automate this in
TCK, especially about Abort effect at various point in time of a
transfer. This is hard to test by the application writer so we should
try to make the API as foolproof as prossible.
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/
More information about the libvir-list
mailing list