From: "Daniel P. Berrangé" <berrange@redhat.com>
To: Markus Armbruster <armbru@redhat.com>
Cc: John Snow <jsnow@redhat.com>, QEMU Developers <qemu-devel@nongnu.org>
Subject: Re: QMP and the 'id' parameter
Date: Tue, 10 Nov 2020 09:15:12 +0000 [thread overview]
Message-ID: <20201110091512.GA866671@redhat.com> (raw)
In-Reply-To: <87361h20kd.fsf@dusky.pond.sub.org>
On Tue, Nov 10, 2020 at 07:22:26AM +0100, Markus Armbruster wrote:
> John Snow <jsnow@redhat.com> writes:
>
> > The QMP specification states:
> >
> >> NOTE: Some errors can occur before the Server is able to read the "id"
> >> member, in these cases the "id" member will not be part of the error
> >> response, even if provided by the client.
> >
> > I am assuming this case ONLY occurs for Parse errors:
> >
> > {'class': 'GenericError', 'desc': 'JSON parse error, expecting value'}
>
> There are more "desc" possible, actually.
>
> The JSON parser gets fed chunks of input, and calls a callback for every
> full JSON value, and on parse error.
>
> QMP's callback is handle_qmp_command(). Parameter @req is the parsed
> JSON value, parameter @err is the (parse) error object, and exactly one
> of them is non-null.
>
> 1. Parse error
>
> If @err, we send an error response for it. It never has "id". See
> qmp_error_response() caller monitor_qmp_dispatcher_co(). The possible
> @err are:
>
> $ grep error_setg qobject/json-*[ch]
> qobject/json-parser.c: error_setg(&ctxt->err, "JSON parse error, %s", message);
>
> This is a syntax error.
>
> Search for parse_error() to see the possible @message patterns.
>
> qobject/json-streamer.c: error_setg(&err, "JSON parse error, stray '%s'", input->str);
>
> This is a lexical error.
>
> qobject/json-streamer.c: error_setg(&err, "JSON token size limit exceeded");
> qobject/json-streamer.c: error_setg(&err, "JSON token count limit exceeded");
> qobject/json-streamer.c: error_setg(&err, "JSON nesting depth limit exceeded");
>
> These are (intentional) parser limits.
>
> 2. Successful parse
>
> If @req, it's a successful parse.
>
> If @req is not a JSON object, there is no "id". qmp_dispatch() reports
>
> error_setg(&err, "QMP input must be a JSON object");
>
> If @req is a JSON object, it has "id" exactly when the client supplied
> one. The response mirrors @req's "id". See qmp_error_response() caller
> qmp_dispatch().
>
> > And I am assuming, in the context of a client that /always/ sets an
> > 'id' for its execute statements, that this means that any error
> > response we receive without an 'id' field *must* be associated with
> > the most-recently-sent command.
>
> Only if the client keeps no more than one command in flight.
>
> Command responses get sent strictly in order (even parse errors), except
> for commands executed out-of-band.
With out of band commands, how much runs in the background ? Is the
JSON parsing still in the foreground, such that we can expect that
even for OOB commands, a error response without a "id" is still
received strictly in order.
Regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
next prev parent reply other threads:[~2020-11-10 9:17 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-11-10 1:47 QMP and the 'id' parameter John Snow
2020-11-10 6:22 ` Markus Armbruster
2020-11-10 9:15 ` Daniel P. Berrangé [this message]
2020-11-10 10:27 ` Markus Armbruster
2020-11-10 16:32 ` John Snow
2020-11-11 8:27 ` Markus Armbruster
2020-11-20 0:22 ` John Snow
2020-11-20 10:25 ` Markus Armbruster
2020-11-20 16:49 ` John Snow
2020-11-23 6:57 ` Markus Armbruster
2020-11-30 18:32 ` John Snow
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=20201110091512.GA866671@redhat.com \
--to=berrange@redhat.com \
--cc=armbru@redhat.com \
--cc=jsnow@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.