From: Anthony Liguori <anthony@codemonkey.ws>
To: Michael Roth <mdroth@linux.vnet.ibm.com>
Cc: Anthony Liguori <aliguori@us.ibm.com>,
agl@linux.vnet.ibm.com, Jes.Sorensen@redhat.com,
qemu-devel@nongnu.org, Luiz Capitulino <lcapitulino@redhat.com>,
aliguori@linux.vnet.ibm.com
Subject: Re: [Qemu-devel] Re: [RFC][PATCH v1 05/12] qapi: fix handling for null-return async callbacks
Date: Mon, 28 Mar 2011 13:27:43 -0500 [thread overview]
Message-ID: <4D90D31F.8020405@codemonkey.ws> (raw)
In-Reply-To: <4D90CC88.5070904@linux.vnet.ibm.com>
On 03/28/2011 12:59 PM, Michael Roth wrote:
>>>
>>> For a command like this, I can't imagine ever wanting to extend the
>>> return value...
>
>
> I think this is another topic, but also one we should hash out a bit
> better.
>
> Currently the plan is that the C API not expose asynchronicity,
> underneath the covers the library will issue the request, then do a
> blocking read for the response. So the API call will block till
> completion, and no other command's will be serviced through the same
> underlying session until it is completed or cancelled.
No, that's just the patches as they stand today.
The medium term goal is to have twin APIs--one API that is synchronous
and another that is asynchronous. The asynchronous version will mirror
how asynchronous commands are dispatched within QEMU. That is, for
query-block, you'll have:
typedef void (*QueryBlockFunc)(void *opaque, BlockInfo *retval, Error *err);
void libqmp_async_query_block(QmpSession *sess, Error **errp,
QueryBlockFunc *cb, void *opaque);
The challenge with async library commands is that you need to think
carefully about how you interact with the socket. You can make a glib
mainloop be a prerequisite, or you can have a set of function pointers
that let you implement your own main loop.
But since there isn't a pressing need for this in the short term, it's
easier to just delay this.
> For the JSON-based clients, the behavior is different. You have an
> optional tag you can pass in for an async command, and after issuing
> one, you can immediately begin issuing other async or non-async
> commands. As a result, the responses you receive will not necessarily
> be in FIFO order.
There is no such thing as a "JSON-based client". QMP is not self
describing enough to implement this with a pure transport client.
Another language implementation (which I think you mean) would still
need to solve the same problem as libqmp.
>
> The upside to this is you can implement async commands on the client
> side without using separate threads, and can exploit some level of
> concurrency being able to do work within a session while a slower
> host->guest command completes. The downsides are that:
>
> 1) There is some inconsistency between this and the C API semantics.
You still need to pass a continuation to implement an event-based
interface regardless of the language you're using. The function
pointer/opaque parameter is a continuation in C.
> 2) The "optional" tags are basically required tags, at least for async
> commands, unless the client side does something to force synchronicity.
>
> One option would be to disable the QMP session's read handler once a
> JSON object is received, and not re-enable it until we send the
> response. This would enforce FIFO-ordering. It might also add reduce
> the potential for a client being able to blow up our TX buffers by
> issuing lots of requests and not handling the responses in a timely
> enough manner (have seen this just from piping responses to stdout).
No, we're mixing up wire semantics with client/server semantics.
These are all completely different things.
The wire semantics are:
1) All commands are tagged. Untagged commands have an implicit tag
(let's refer to it as the psuedo-tag).
2) Until a command is completed, a tag cannot be reused. This is also
true for the psuedo-tag.
3) There is no guarantee about command completion order.
4) If a client happens to use the same tag for all commands, the client
ends up enforcing a completion order because the server is only ever
processing one command at a time.
The server semantics are:
1) All tags are preserved including the psuedo-tag. This is required by
the protocol.
2) Most commands are implemented by immediately dispatching a function
and then computing the return value and immediately putting on the
socket buffer.
3) Some commands are implemented by delaying the computation of the
return value. When this happens (which is an indeterminate amount of
time later), the data will be put on the socket buffer.
4) Which commands are handled by (2) vs. (3) are transparent to the client.
The (current) client semantics are:
1) All commands are tagged with the psuedo-tag which enforces that only
one command can be in flight at a time. In the future, this interface
will support threading and use different tags such that two threads can
be used to send simultaneous commands.
2) A second interface will be implemented that provides an event-based
interface whereas each command is passed a continuation. Commands will
use different tags to support this interface.
3) The reason to have both interfaces is to support the two most common
models of concurrency, event-based concurrency and thread based concurrency.
Notice that I said nothing about 'C' in the above. It's equally true to
a C or Python client.
Regards,
Anthony Liguori
> Thoughts?
>
next prev parent reply other threads:[~2011-03-28 18:27 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-03-25 19:47 [Qemu-devel] [RFC][PATCH v1 00/11] QEMU Guest Agent: QMP-based host/guest communication (virtagent) Michael Roth
2011-03-25 19:47 ` [Qemu-devel] [RFC][PATCH v1 01/12] json-lexer: make lexer error-recovery more deterministic Michael Roth
2011-03-25 21:18 ` [Qemu-devel] " Anthony Liguori
2011-03-25 19:47 ` [Qemu-devel] [RFC][PATCH v1 02/12] json-streamer: add handling for JSON_ERROR token/state Michael Roth
2011-03-25 19:47 ` [Qemu-devel] [RFC][PATCH v1 03/12] json-parser: add handling for NULL token list Michael Roth
2011-03-25 19:47 ` [Qemu-devel] [RFC][PATCH v1 04/12] qapi: fix function name typo in qmp-gen.py Michael Roth
2011-03-25 19:47 ` [Qemu-devel] [RFC][PATCH v1 05/12] qapi: fix handling for null-return async callbacks Michael Roth
2011-03-25 21:22 ` [Qemu-devel] " Anthony Liguori
2011-03-28 16:47 ` Luiz Capitulino
2011-03-28 17:01 ` Anthony Liguori
2011-03-28 17:06 ` Luiz Capitulino
2011-03-28 17:19 ` Anthony Liguori
2011-03-28 17:27 ` Luiz Capitulino
2011-03-28 17:39 ` Anthony Liguori
2011-03-28 17:59 ` Michael Roth
2011-03-28 18:27 ` Anthony Liguori [this message]
2011-03-28 20:42 ` Michael Roth
2011-03-28 20:45 ` Anthony Liguori
2011-03-25 19:47 ` [Qemu-devel] [RFC][PATCH v1 06/12] qmp proxy: build qemu with guest proxy dependency Michael Roth
2011-03-25 19:47 ` [Qemu-devel] [RFC][PATCH v1 07/12] qmp proxy: core code for proxying qmp requests to guest Michael Roth
2011-03-25 21:27 ` [Qemu-devel] " Anthony Liguori
2011-03-25 21:56 ` Michael Roth
2011-03-28 19:05 ` Anthony Liguori
2011-03-28 19:57 ` Michael Roth
2011-03-25 19:47 ` [Qemu-devel] [RFC][PATCH v1 08/12] qemu-char: add qmp_proxy chardev Michael Roth
2011-03-25 21:29 ` [Qemu-devel] " Anthony Liguori
2011-03-25 22:11 ` Michael Roth
2011-03-28 17:45 ` Anthony Liguori
2011-03-29 18:54 ` Michael Roth
2011-03-25 19:47 ` [Qemu-devel] [RFC][PATCH v1 09/12] guest agent: core marshal/dispatch interfaces Michael Roth
2011-03-25 19:47 ` [Qemu-devel] [RFC][PATCH v1 10/12] guest agent: qemu-ga daemon Michael Roth
2011-04-01 9:45 ` [Qemu-devel] " Jes Sorensen
2011-03-25 19:47 ` [Qemu-devel] [RFC][PATCH v1 11/12] guest agent: guest-side command implementations Michael Roth
2011-03-25 19:47 ` [Qemu-devel] [RFC][PATCH v1 12/12] guest agent: build qemu-ga, add QEMU-wide gio dep Michael Roth
2011-03-25 20:42 ` [Qemu-devel] Re: [RFC][PATCH v1 00/11] QEMU Guest Agent: QMP-based host/guest communication (virtagent) Michael Roth
2011-03-25 22:03 ` Anthony Liguori
2011-03-25 22:36 ` Michael Roth
2011-03-28 17:03 ` Anthony Liguori
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4D90D31F.8020405@codemonkey.ws \
--to=anthony@codemonkey.ws \
--cc=Jes.Sorensen@redhat.com \
--cc=agl@linux.vnet.ibm.com \
--cc=aliguori@linux.vnet.ibm.com \
--cc=aliguori@us.ibm.com \
--cc=lcapitulino@redhat.com \
--cc=mdroth@linux.vnet.ibm.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).