From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=40844 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PxhzV-0007jE-H0 for qemu-devel@nongnu.org; Thu, 10 Mar 2011 10:41:30 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PxhzT-0003ii-3p for qemu-devel@nongnu.org; Thu, 10 Mar 2011 10:41:29 -0500 Received: from mail-gy0-f173.google.com ([209.85.160.173]:48914) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PxhzS-0003ic-TS for qemu-devel@nongnu.org; Thu, 10 Mar 2011 10:41:27 -0500 Received: by gyd8 with SMTP id 8so849990gyd.4 for ; Thu, 10 Mar 2011 07:41:26 -0800 (PST) Message-ID: <4D78F11B.4050402@codemonkey.ws> Date: Thu, 10 Mar 2011 09:41:15 -0600 From: Anthony Liguori MIME-Version: 1.0 Subject: Re: [Qemu-devel] [PATCH 19/22] qapi: add QMP put-event command References: <1299460984-15849-1-git-send-email-aliguori@us.ibm.com> <1299460984-15849-20-git-send-email-aliguori@us.ibm.com> <4D778117.9060505@redhat.com> <4D778545.7040403@codemonkey.ws> <4D778797.9090602@redhat.com> <4D778E07.5070408@codemonkey.ws> <4D78C69F.6010003@redhat.com> <4D78DC5A.3000601@codemonkey.ws> <4D78DF3A.9000600@redhat.com> <4D78EEA3.9050401@redhat.com> In-Reply-To: <4D78EEA3.9050401@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Avi Kivity Cc: Luiz Capitulino , Markus Armbruster , qemu-devel@nongnu.org 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