From: Anthony Liguori <anthony@codemonkey.ws>
To: Kevin Wolf <kwolf@redhat.com>
Cc: Markus Armbruster <armbru@redhat.com>,
qemu-devel <qemu-devel@nongnu.org>,
Luiz Capitulino <lcapitulino@redhat.com>
Subject: Re: [Qemu-devel] Re: [RFC] qapi: events in QMP
Date: Wed, 16 Feb 2011 08:32:47 -0600 [thread overview]
Message-ID: <4D5BE00F.8000209@codemonkey.ws> (raw)
In-Reply-To: <4D5BDBF1.8020501@redhat.com>
On 02/16/2011 08:15 AM, Kevin Wolf wrote:
> Am 16.02.2011 14:43, schrieb Anthony Liguori:
>
>> On 02/16/2011 02:50 AM, Kevin Wolf wrote:
>>
>>> Am 16.02.2011 01:59, schrieb Anthony Liguori:
>>>
>>>
>>>> On 02/15/2011 07:38 AM, Luiz Capitulino wrote:
>>>>
>>>>
>>>>> On Tue, 15 Feb 2011 10:20:01 +0100
>>>>> Kevin Wolf<kwolf@redhat.com> wrote:
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>> Am 14.02.2011 20:34, schrieb Anthony Liguori:
>>>>>>
>>>>>>
>>>>>>
>>>>>>> On 02/14/2011 12:34 PM, Luiz Capitulino wrote:
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>> On Mon, 14 Feb 2011 08:39:11 -0600
>>>>>>>> Anthony Liguori<anthony@codemonkey.ws> wrote:
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>> On 02/14/2011 06:45 AM, Luiz Capitulino wrote:
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>> So the question is: how does the schema based design support extending
>>>>>>>>>> commands or events? Does it require adding new commands/events?
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>> Well, let me ask you, how do we do that today?
>>>>>>>>>
>>>>>>>>> Let's say that I want to add a new parameter to the `change' function so
>>>>>>>>> that I can include a salt parameter as part of the password.
>>>>>>>>>
>>>>>>>>> The way we'd do this today is by checking for the 'salt' parameter in
>>>>>>>>> qdict, and if it's not present, use a random salt or something like that.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>> You likely want to do what you did before. Of course that you have to
>>>>>>>> consider if what you're doing is extending an existing command or badly
>>>>>>>> overloading it (like change is today), in this case you'll want to add
>>>>>>>> a new command instead.
>>>>>>>>
>>>>>>>> But yes, the use-case here is extending an existing command.
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>> However, if I'm a QMP client, how can I tell whether you're going to
>>>>>>>>> ignore my salt parameter or actually use it? Nothing in QMP tells me
>>>>>>>>> this today. If I set the salt parameter in the `change' command, I'll
>>>>>>>>> just get a success message.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>> I'm sorry?
>>>>>>>>
>>>>>>>> { "execute": "change", "arguments": { "device": "vnc", "target": "password", "arg": "1234", "salt": "r1" } }
>>>>>>>> {"error": {"class": "InvalidParameter", "desc": "Invalid parameter 'salt'", "data": {"name": "salt"}}}
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>> So I'm supposed to execute the command, and if execution fails, drop the
>>>>>>> new parameter? If we add a few optional parameters, does that mean I
>>>>>>> have to try every possible combination of parameters?
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>> How is that different from trying out multiple commands? In the end, you
>>>>>> always need some meta information like a schema in order to avoid trying
>>>>>> out which parameters the server supports.
>>>>>>
>>>>>> Anyway, I think there's a second interesting point: Adding parameters
>>>>>> does cause these problems, but it's different for data sent from qemu to
>>>>>> the client (return values and events). If we add more information there,
>>>>>> an older client can just ignore it, without even looking at a schema.
>>>>>>
>>>>>> So I think we should consider this for return values and definitely do
>>>>>> it for events. Sending out five different messages for a single event
>>>>>> that are completely redundant and only differ in the number of fields is
>>>>>> just insane (okay, they wouldn't actually get on the wire because a
>>>>>> client registers only for one of them, but the code for generating them
>>>>>> must exist).
>>>>>>
>>>>>>
>>>>>>
>>>>> That's my point when I asked about events in the other thread.
>>>>>
>>>>>
>>>>>
>>>> Okay, I had confused myself about this. It's not quite as bad as I had
>>>> been saying.
>>>>
>>>> One of the reasons to have generated allocation function is so that we
>>>> can make sure to always pad structures. Since all optional fields has a
>>>> bool to indicate the fields presence, by setting the allocated structure
>>>> to zero, we can support forwards compatibility for structures.
>>>>
>>>>
>>> I think in most cases we would even get away with a default value
>>> instead of the bool. For example for strings, NULL would be a very clear
>>> indication that the field wasn't there in the JSON message.
>>>
>> In order to support forwards compatibility, we need to have a zero-value
>> for non-presence. For strings or pointers, NULL would work very well.
>>
> What's the kind of compatibility you're concerned about? I was mainly
> considering older clients communicating with newer qemu, i.e.
> compatibility on the protocol level.
The has_XX fields are not sent over the wire.
> The library can set default values
> for fields that are not present in JSON messages it receives.
>
> Your point is older applications using a newer library?
Compiled against a new library, but running against an old library.
This has to be supported in order to avoid bumping the library version.
>> That's not entirely true. For human-monitor-command, we return a bare
>> string. For all other commands, we return structures specifically to
>> enable better forwards compatibility.
>>
>> I do agree that for most of our events, we should be using a structure
>> for passing information. That's not what we're doing today but there's
>> only a couple events that are even doing that so fixing it won't be that
>> bad.
>>
> Right, you could still have something like this (although I'm not sure
> if it's very useful):
>
> [ 'block-io-event', {}, {}, 'string' ]
>
> What I think isn't a good idea is that the following definition doesn't
> generate a structure in your original proposal. This should really
> generate a structure:
>
> { 'BlockIOEvent': {'device': 'string', 'action': 'string', 'operation':
> 'string'} }
> [ 'block-io-event', {}, {}, 'BlockIOEvent' ]
>
Actually, I think it's better to explicitly call out the structure name
so that you can do things like:
{ 'VncConnectedEvent': {'info': 'VncClientInfo'} }
Which happens to be the same structure used by 'query-vnc'
Regards,
Anthony Liguori
> Kevin
>
>
next prev parent reply other threads:[~2011-02-16 14:33 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-02-13 18:08 [Qemu-devel] [RFC] qapi: events in QMP Anthony Liguori
2011-02-13 18:15 ` Anthony Liguori
2011-02-14 9:50 ` [Qemu-devel] " Kevin Wolf
2011-02-14 12:03 ` Anthony Liguori
2011-02-14 12:32 ` Kevin Wolf
2011-02-14 12:45 ` Luiz Capitulino
2011-02-14 14:39 ` Anthony Liguori
2011-02-14 18:34 ` Luiz Capitulino
2011-02-14 19:34 ` Anthony Liguori
2011-02-14 19:58 ` Luiz Capitulino
2011-02-14 20:01 ` Luiz Capitulino
2011-02-14 20:15 ` Anthony Liguori
2011-02-15 13:35 ` Luiz Capitulino
2011-02-15 14:54 ` Markus Armbruster
2011-02-15 9:20 ` Kevin Wolf
2011-02-15 13:38 ` Luiz Capitulino
2011-02-16 0:59 ` Anthony Liguori
2011-02-16 8:50 ` Kevin Wolf
2011-02-16 13:43 ` Anthony Liguori
2011-02-16 14:15 ` Kevin Wolf
2011-02-16 14:32 ` Anthony Liguori
2011-02-16 14:32 ` Anthony Liguori [this message]
2011-02-14 21:14 ` Anthony Liguori
2011-02-14 13:28 ` Luiz Capitulino
2011-02-14 13:33 ` Daniel P. Berrange
2011-02-14 14:24 ` Anthony Liguori
2011-02-14 14:32 ` Anthony Liguori
2011-02-15 14:07 ` What's QAPI? (was: [Qemu-devel] [RFC] qapi: events in QMP) Markus Armbruster
2011-02-15 14:13 ` [Qemu-devel] Re: What's QAPI? Anthony Liguori
2011-02-15 16:15 ` 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=4D5BE00F.8000209@codemonkey.ws \
--to=anthony@codemonkey.ws \
--cc=armbru@redhat.com \
--cc=kwolf@redhat.com \
--cc=lcapitulino@redhat.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).