Re: [PATCH v2 1/5] qapi: Enable enum member introspection to show more than name

2021-10-21 Thread Markus Armbruster
Kevin Wolf  writes:

> Am 09.10.2021 um 14:09 hat Markus Armbruster geschrieben:
>> The next commit will add feature flags to enum members.  There's a
>> problem, though: query-qmp-schema shows an enum type's members as an
>> array of member names (SchemaInfoEnum member @values).  If it showed
>> an array of objects with a name member, we could simply add more
>> members to these objects.  Since it's just strings, we can't.
>> 
>> I can see three ways to correct this design mistake:
>> 
>> 1. Do it the way we should have done it, plus compatibility goo.
>> 
>>We want a ['SchemaInfoEnumMember'] member in SchemaInfoEnum.  Since
>>changing @values would be a compatibility break, add a new member
>>@members instead.
>> 
>>@values is now redundant.  In my testing, output of
>>qemu-system-x86_64's query-qmp-schema grows by 11% (18.5KiB).
>> 
>>We can deprecate @values now and drop it later.  This will break
>>outmoded clients.  Well-behaved clients such as libvirt are
>>expected to break cleanly.
>> 
>> 2. Like 1, but omit "boring" elements of @member, and empty @member.
>> 
>>@values does not become redundant.  @members augments it.  Somewhat
>>cumbersome, but output of query-qmp-schema grows only as we make
>>enum members non-boring.
>> 
>>There is nothing to deprecate here.
>> 
>> 3. Versioned query-qmp-schema.
>> 
>>query-qmp-schema provides either @values or @members.  The QMP
>>client can select which version it wants.  There is no redundant
>>output.
>> 
>>We can deprecate old versions and eventually drop them.  This will
>>break outmoded clients.  Breaking cleanly is easier than for 1.
>> 
>>While 1 and 2 operate within the common rules for compatible
>>evolution apply (section "Compatibility considerations" in
>>docs/devel/qapi-code-gen.rst), 3 bypasses them.  Attractive when
>>operating within the rules is just too awkward.  Not the case here.
>> 
>> This commit implements 1.  Libvirt developers prefer it.
>> 
>> Signed-off-by: Markus Armbruster 
>> ---
>>  qapi/introspect.json   | 21 +++--
>>  scripts/qapi/introspect.py | 18 ++
>>  2 files changed, 33 insertions(+), 6 deletions(-)
>
> docs/devel/qapi-code-gen.rst still says:
>
>   The SchemaInfo for an enumeration type has meta-type "enum" and
>   variant member "values".  The values are listed in no particular
>   order; clients must search the entire enum when learning whether a
>   particular value is supported.
>
>   Example: the SchemaInfo for MyEnum from section `Enumeration types`_ ::
>
>   { "name": "MyEnum", "meta-type": "enum",
> "values": [ "value1", "value2", "value3" ] }
>
> It probably needs an update.

It sure does.  Thanks!



Re: [PATCH v2 1/5] qapi: Enable enum member introspection to show more than name

2021-10-12 Thread Kevin Wolf
Am 09.10.2021 um 14:09 hat Markus Armbruster geschrieben:
> The next commit will add feature flags to enum members.  There's a
> problem, though: query-qmp-schema shows an enum type's members as an
> array of member names (SchemaInfoEnum member @values).  If it showed
> an array of objects with a name member, we could simply add more
> members to these objects.  Since it's just strings, we can't.
> 
> I can see three ways to correct this design mistake:
> 
> 1. Do it the way we should have done it, plus compatibility goo.
> 
>We want a ['SchemaInfoEnumMember'] member in SchemaInfoEnum.  Since
>changing @values would be a compatibility break, add a new member
>@members instead.
> 
>@values is now redundant.  In my testing, output of
>qemu-system-x86_64's query-qmp-schema grows by 11% (18.5KiB).
> 
>We can deprecate @values now and drop it later.  This will break
>outmoded clients.  Well-behaved clients such as libvirt are
>expected to break cleanly.
> 
> 2. Like 1, but omit "boring" elements of @member, and empty @member.
> 
>@values does not become redundant.  @members augments it.  Somewhat
>cumbersome, but output of query-qmp-schema grows only as we make
>enum members non-boring.
> 
>There is nothing to deprecate here.
> 
> 3. Versioned query-qmp-schema.
> 
>query-qmp-schema provides either @values or @members.  The QMP
>client can select which version it wants.  There is no redundant
>output.
> 
>We can deprecate old versions and eventually drop them.  This will
>break outmoded clients.  Breaking cleanly is easier than for 1.
> 
>While 1 and 2 operate within the common rules for compatible
>evolution apply (section "Compatibility considerations" in
>docs/devel/qapi-code-gen.rst), 3 bypasses them.  Attractive when
>operating within the rules is just too awkward.  Not the case here.
> 
> This commit implements 1.  Libvirt developers prefer it.
> 
> Signed-off-by: Markus Armbruster 
> ---
>  qapi/introspect.json   | 21 +++--
>  scripts/qapi/introspect.py | 18 ++
>  2 files changed, 33 insertions(+), 6 deletions(-)

docs/devel/qapi-code-gen.rst still says:

  The SchemaInfo for an enumeration type has meta-type "enum" and
  variant member "values".  The values are listed in no particular
  order; clients must search the entire enum when learning whether a
  particular value is supported.

  Example: the SchemaInfo for MyEnum from section `Enumeration types`_ ::

  { "name": "MyEnum", "meta-type": "enum",
"values": [ "value1", "value2", "value3" ] }

It probably needs an update.

Kevin



Re: [PATCH v2 1/5] qapi: Enable enum member introspection to show more than name

2021-10-11 Thread Eric Blake
On Sat, Oct 09, 2021 at 02:09:40PM +0200, Markus Armbruster wrote:
> The next commit will add feature flags to enum members.  There's a
> problem, though: query-qmp-schema shows an enum type's members as an
> array of member names (SchemaInfoEnum member @values).  If it showed
> an array of objects with a name member, we could simply add more
> members to these objects.  Since it's just strings, we can't.
> 
> I can see three ways to correct this design mistake:
> 
> 1. Do it the way we should have done it, plus compatibility goo.
...
> 2. Like 1, but omit "boring" elements of @member, and empty @member.

> 3. Versioned query-qmp-schema.

> This commit implements 1.  Libvirt developers prefer it.
> 
> Signed-off-by: Markus Armbruster 
> ---
>  qapi/introspect.json   | 21 +++--
>  scripts/qapi/introspect.py | 18 ++
>  2 files changed, 33 insertions(+), 6 deletions(-)

Reviewed-by: Eric Blake 

> 
> diff --git a/qapi/introspect.json b/qapi/introspect.json
> index 39bd303778..f806bd7281 100644
> --- a/qapi/introspect.json
> +++ b/qapi/introspect.json
> @@ -142,14 +142,31 @@
>  #
>  # Additional SchemaInfo members for meta-type 'enum'.
>  #
> -# @values: the enumeration type's values, in no particular order.
> +# @members: the enum type's members, in no particular order
> +#   (since 6.2).
> +#
> +# @values: the enumeration type's member names, in no particular order.
> +#  Redundant with @members.  Just for backward compatibility.
>  #
>  # Values of this type are JSON string on the wire.
>  #
>  # Since: 2.5
>  ##
>  { 'struct': 'SchemaInfoEnum',
> -  'data': { 'values': ['str'] } }
> +  'data': { 'members': [ 'SchemaInfoEnumMember' ],
> +'values': ['str'] } }

Not deprecated at this time, I agree with your choice to make the
actual deprecation of 'values' to be in a later patch (if at all).

> +
> +##
> +# @SchemaInfoEnumMember:
> +#
> +# An object member.
> +#
> +# @name: the member's name, as defined in the QAPI schema.
> +#
> +# Since: 6.2
> +##
> +{ 'struct': 'SchemaInfoEnumMember',
> +  'data': { 'name': 'str' } }

Reviewed-by: Eric Blake 

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.   +1-919-301-3266
Virtualization:  qemu.org | libvirt.org