From: Eric Blake <eblake@redhat.com>
To: "Markus Armbruster" <armbru@redhat.com>,
"Daniel P. Berrangé" <berrange@redhat.com>
Cc: libvir-list@redhat.com, "Ján Tomko" <jtomko@redhat.com>,
"Dr. David Alan Gilbert" <dgilbert@redhat.com>,
qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [libvirt] QMP; unsigned 64-bit ints; JSON standards compliance
Date: Mon, 13 May 2019 10:15:37 -0500 [thread overview]
Message-ID: <a3378e24-f13f-b51f-7180-8e0bf4661e10@redhat.com> (raw)
In-Reply-To: <87ef525uls.fsf@dusky.pond.sub.org>
[-- Attachment #1: Type: text/plain, Size: 2771 bytes --]
On 5/13/19 8:53 AM, Markus Armbruster wrote:
>> We have a few options
>>
>> 1. Use string format for values > 2^53-1, int format below that
>> 2. Use string format for all fields which are 64-bit ints whether
>> signed or unsigned
>> 3. Use string format for all fields which are integers, even 32-bit
>> ones
>>
>> I would probably suggest option 2. It would make the QEMU impl quite
>> easy IIUC, we we'd just change the QAPI visitor's impl for the int64
>> and uint64 fields to use string format (when the right capability is
>> negotiated by QMP).
>>
>> I include 3 only for completeness - I don't think there's a hugely
>> compelling reason to mess with 32-bit ints.
>
> Agree.
Other than if we ever change the type of a QMP integer. Right now, if we
widen from 'int32' to 'int' (aka 'int64'), it is invisible to clients;
but once we start stringizing 64-bit numbers (at client request) but NOT
32-bit numbers, then changing a type from 32 to 64 bits (or the
converse) becomes an API change to clients. Introspection will at least
let a client know which form to expect, but it does mean we have to be
more aware of typing issues going forward.
>
>> Option 1 is the bare minimum needed to ensure precision, but to me
>> it feels a bit dirty to say a given field will have different encoding
>> depending on the value. If apps need to deal with string encoding, they
>> might as well just use it for all values in a given field.
>
> I guess that depends on what this interoperability capability does for
> QMP *input*.
"Be liberal in what you accept, strict in what you produce" - that
argues we should accept both forms on input (it's easy enough to ALWAYS
permit a string in place of an integer, and to take an in-range integer
even when we would in turn output it as a string).
>
> For *output*, QEMU has to encode a number either as JSON number or as
> JSON string
For output, we should document that whatever capability the client
passes in at initial connect controls the behavior of all future integer
outputs (and if no capability is negotiated, we output all integers as
integers, even if it risks overflowing the client's JSON parser).
>
> For *input*, QEMU could accept either. Or it could accept only the
> encoding it produces on output.
>
> Got a preference?
>
My ramblings above argue to teach the parser to always allow both
integer and string forms regardless of width, to output 32-bit integers
as integers, and to output 64-bit integers as string-only (if capability
is negotiated) or as integer-only (if in back-compat mode).
--
Eric Blake, Principal Software Engineer
Red Hat, Inc. +1-919-301-3226
Virtualization: qemu.org | libvirt.org
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
next prev parent reply other threads:[~2019-05-13 15:35 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-04-30 13:19 [Qemu-devel] QMP; unsigned 64-bit ints; JSON standards compliance Daniel P. Berrangé
2019-04-30 13:19 ` Daniel P. Berrangé
2019-04-30 14:45 ` Dr. David Alan Gilbert
2019-04-30 14:45 ` Dr. David Alan Gilbert
2019-04-30 15:05 ` Daniel P. Berrangé
2019-04-30 15:05 ` Daniel P. Berrangé
2019-05-07 8:47 ` Markus Armbruster
2019-05-07 9:39 ` Daniel P. Berrangé
2019-05-07 16:32 ` Eric Blake
2019-05-08 12:37 ` Markus Armbruster
2019-05-08 12:44 ` Dr. David Alan Gilbert
2019-05-08 12:44 ` Markus Armbruster
2019-05-13 12:08 ` Daniel P. Berrangé
2019-05-13 12:29 ` Dr. David Alan Gilbert
2019-05-13 12:35 ` Daniel P. Berrangé
2019-05-13 14:10 ` Markus Armbruster
2019-05-13 13:53 ` Markus Armbruster
2019-05-13 14:10 ` Daniel P. Berrangé
2019-05-13 15:15 ` Eric Blake [this message]
2019-05-14 6:02 ` [Qemu-devel] [libvirt] " Markus Armbruster
2019-05-14 9:26 ` Daniel P. Berrangé
2019-05-14 9:37 ` Dr. David Alan Gilbert
2019-05-14 9:43 ` Daniel P. Berrangé
2019-05-14 9:47 ` Peter Krempa
2019-06-04 6:38 ` [Qemu-devel] " Markus Armbruster
2019-06-05 13:06 ` Daniel P. Berrangé
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=a3378e24-f13f-b51f-7180-8e0bf4661e10@redhat.com \
--to=eblake@redhat.com \
--cc=armbru@redhat.com \
--cc=berrange@redhat.com \
--cc=dgilbert@redhat.com \
--cc=jtomko@redhat.com \
--cc=libvir-list@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).