On 03/10/2011 09:30 AM, Avi Kivity wrote:
On 03/10/2011 04:24 PM, Avi Kivity wrote:
What would the wire exchange look like?
> { 'execute': 'get-block-io-error-event' }
< { 'return' : 32 }
...
< { 'event': 'BLOCK_IO_ERROR', 'data': { 'action': 'stop', 'device':
'ide0-hd0', 'operation': 'read' }, 'tag': 32 }
...
> { 'execute': 'put-event', 'arguments': { 'tag': 32 } }
Well, I may be biased, but I prefer my variant.
btw, it's good to decree that a subscription is immediately followed
by an event with the current state (which means events have to
provide state and be idempotent); so the subscribe-and-query pattern
is provided automatically.
btw2, I now nominate subscribe and unsubscribe as replacements for
get and put.
I also think it should be at the protocol layer:
> { execute: some-command, id: foo, arguments: { ... } }
< { result: { ... }, id: foo }
> { subscribe: block-io-error, id: bar, arguments: { ... } }
< { result: { ... } id: bar }
< { event: block-io-error, id: bar, data : { ... } }
> { unsubscribe: block-io-error, id: bar }
< { result: { ... } id: bar }
So events are now protocol-level pieces like commands, and the use of
tags is uniform.
Maybe for QMPv2, but for QMPv1, this is going to introduce an extremely
incompatible change.
Actually, we missed the json-rpc boat in designing QMP. It should look
like:
> { method: some-command, id: foo, params: { ... } }
< { result: { ... }, id: foo, params: { ... }, error: null }
> { method: connect-block-io-error, id: bar, params: { ... } }
< { result: { ... }, id: bar, error: null }
< { method: block-io-error, id: null, params: { ... } }
Keys are different and null is passed instead of not including a tag.
Events are sent exactly like methods but id is null. A result is never
sent to the server for an event.
One of the good things about using a code generator and IDL though is
that we can add a -qmp dev,protocol=json-rpc that encodes
appropriately. We can probably do this translation at the QObject level
really. But in the future, we can also add -qmp dev,protocol=xml-rpc,
-qmp dev,protocol=rest, or -qmp dev,protocol=asn1-rpc
Regards,
Anthony Liguori