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



Reply via email to