qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Eric Blake <eblake@redhat.com>
To: Markus Armbruster <armbru@redhat.com>
Cc: marcandre.lureau@redhat.com, DirtY.iCE.hu@gmail.com,
	qemu-devel@nongnu.org, ehabkost@redhat.com,
	Michael Roth <mdroth@linux.vnet.ibm.com>
Subject: Re: [Qemu-devel] [PATCH v5 07/46] qapi: Don't pass pre-existing error to later call
Date: Thu, 24 Sep 2015 10:14:37 -0600	[thread overview]
Message-ID: <5604216D.2010509@redhat.com> (raw)
In-Reply-To: <87r3lneuet.fsf@blackfin.pond.sub.org>

[-- Attachment #1: Type: text/plain, Size: 5004 bytes --]

On 09/24/2015 08:58 AM, Markus Armbruster wrote:
> Eric Blake <eblake@redhat.com> writes:
> 
>> Due to the existing semantics of the error_set() family,
>> generated sequences in the qapi visitors such as:
>>
>>     visit_start_implicit_struct(m, (void **)obj, sizeof(FOO), &err);
>>         if (!err) {
>>             visit_type_FOO_fields(m, obj, errp);
>>             visit_end_implicit_struct(m, &err);
>>         }
>>     error_propagate(errp, err);
> 
> Indentation seems off.  Intentional?

No, probably due to rebase churn (I reindented generated code in 9/46,
but the series as I worked on it wasn't always in the order presented
here).  Will fix.

> 
>>
>> are risky: if visit_type_FOO_fields() sets errp, and then
>> visit_end_implicit_struct() also encounters an error, the
>> attempt to overwrite the first error will cause an abort().
>> Obviously, we weren't triggering this situation (none of the
>> existing callbacks for visit_end_implicit_struct() currently
>> try to set an error), but it is better to not even cause the
>> problem in the first place.
> 
> The code works, but it sets a problematic example.
> 
>> Meanwhile, in spite of the poor documentation of the qapi
>> visitors, we want to guarantee that if a visit_start_*()
>> succeeds, then the matching visit_end_*() will be called.
> 
> Agreed.
> 
>> The options are to either propagate and clear a local err
>> multiple times:
>>
>>     visit_start_implicit_struct(m, (void **)obj, sizeof(FOO), &err);
>>         if (!err) {
>>             visit_type_FOO_fields(m, obj, &err);
>>             if (err) {
>>                 error_propagate(errp, err);
>>                 err = NULL;
>>             }
>>             visit_end_implicit_struct(m, &err);
>>         }
>>     error_propagate(errp, err);

More poor indentation on my part.

>>
>> or, as this patch does, just pass in NULL to ignore further
>> errors once an error has occurred.
>>
>>     visit_start_implicit_struct(m, (void **)obj, sizeof(FOO), &err);
>>         if (!err) {
>>             visit_type_FOO_fields(m, obj, &err);
>>             visit_end_implicit_struct(m, err ? NULL : &err);
>>         }
>>     error_propagate(errp, err);
> 
> Hmmmmm... not sure we do this anywhere else, yet.  The ternary isn't
> exactly pretty, but the intent to ignore additional error is clear
> enough, I think.
> 
> If we elect to adopt this new error handling pattern, we should perhaps
> document it in error.h.
> 
> Third option: drop visit_end_implicit_struct()'s errp parameter.  If we
> find a compelling use for it, we'll put it back and solve the problem.
> 

Ooh, interesting idea.  It changes the contract - but since the contract
isn't (yet) documented, and happens to work with existing uses without a
contract, it could indeed be nicer.  It would have knock-on effects to
24/46 where I first try documenting the contract.

>>      visit_start_implicit_struct(m, (void **)obj, sizeof(%(c_type)s), &err);
>>      if (!err) {
>> -        visit_type_%(c_type)s_fields(m, obj, errp);
>> -        visit_end_implicit_struct(m, &err);
>> +        visit_type_%(c_type)s_fields(m, obj, &err);
>> +        visit_end_implicit_struct(m, err ? NULL : &err);

>>      visit_start_struct(m, (void **)obj, "%(name)s", name, sizeof(%(c_name)s), &err);
>>      if (!err) {
>>          if (*obj) {
>> -            visit_type_%(c_name)s_fields(m, obj, errp);
>> +            visit_type_%(c_name)s_fields(m, obj, &err);
>>          }
>> -        visit_end_struct(m, &err);
>> +        visit_end_struct(m, err ? NULL : &err);
>>      }
>>      error_propagate(errp, err);
>>  }
> 
> Oh, it's about visit_end_struct(), too.  Commit message only talks about
> visit_end_implicit_struct().
> 
> In particular, "none of the existing callbacks for
> visit_end_implicit_struct() currently try to set an error".  Does that
> hold for visit_end_struct() callbacks, too?

I'm fairly certain that ALL of the visit_end_* callbacks were similar in
nature, but you've prompted me to re-audit things and update the commit
message to be absolutely clear about it.

> 
>> @@ -175,9 +175,7 @@ void visit_type_%(c_name)s(Visitor *m, %(c_name)s **obj, const char *name, Error
>>          visit_type_%(c_elt_type)s(m, &native_i->value, NULL, &err);
>>      }
>>
>> -    error_propagate(errp, err);
>> -    err = NULL;
>> -    visit_end_list(m, &err);
>> +    visit_end_list(m, err ? NULL : &err);
>>  out:
>>      error_propagate(errp, err);
>>  }
> 
> Likewise.  Does it hold for visit_end_list() callbacks, too?
> 
> Looks like you switch from option 1 to option 2 here.  Your slate isn't
> as clean as the commit message suggests :)

Consistency is nice, but documenting where we started from to get to the
consistent state would be even nicer. Point taken.

-- 
Eric Blake   eblake redhat com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 604 bytes --]

  reply	other threads:[~2015-09-24 16:14 UTC|newest]

Thread overview: 108+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-09-21 21:57 [Qemu-devel] [PATCH v5 00/46] post-introspection cleanups, and qapi-ify netdev_add Eric Blake
2015-09-21 21:57 ` [Qemu-devel] [PATCH v5 01/46] qapi: Sort qapi-schema tests Eric Blake
2015-09-23 14:26   ` Eric Blake
2015-09-23 15:09     ` Markus Armbruster
2015-09-23 15:19       ` Eric Blake
2015-09-21 21:57 ` [Qemu-devel] [PATCH v5 02/46] qapi: Clean up qapi.py per pep8 Eric Blake
2015-09-22 14:00   ` Markus Armbruster
2015-09-22 14:58     ` Eric Blake
2015-09-23  9:20       ` Markus Armbruster
2015-09-21 21:57 ` [Qemu-devel] [PATCH v5 03/46] qapi: Test for C member name collisions Eric Blake
2015-09-22 15:23   ` Markus Armbruster
2015-09-22 17:52     ` Eric Blake
2015-09-23  9:43       ` Markus Armbruster
2015-09-23 12:45         ` Eric Blake
2015-09-23 14:02           ` Markus Armbruster
2015-09-23 14:19             ` Eric Blake
2015-09-23 15:12               ` Markus Armbruster
2015-09-21 21:57 ` [Qemu-devel] [PATCH v5 04/46] qapi: Add tests for empty unions Eric Blake
2015-09-24 14:16   ` Markus Armbruster
2015-09-24 15:52     ` Eric Blake
2015-09-21 21:57 ` [Qemu-devel] [PATCH v5 05/46] qapi: Test use of 'number' within alternates Eric Blake
2015-09-24 14:36   ` Markus Armbruster
2015-09-24 16:00     ` Eric Blake
2015-09-24 16:29       ` Markus Armbruster
2015-09-25 22:32         ` Eric Blake
2015-09-28  9:26           ` Markus Armbruster
2015-09-25 22:50         ` Eric Blake
2015-09-21 21:57 ` [Qemu-devel] [PATCH v5 06/46] qapi: Improve 'include' error message Eric Blake
2015-09-24 14:39   ` Markus Armbruster
2015-09-24 16:04     ` Eric Blake
2015-09-21 21:57 ` [Qemu-devel] [PATCH v5 07/46] qapi: Don't pass pre-existing error to later call Eric Blake
2015-09-24 14:58   ` Markus Armbruster
2015-09-24 16:14     ` Eric Blake [this message]
2015-09-26 21:05       ` Eric Blake
2015-09-28  9:14         ` Markus Armbruster
2015-10-06 21:10           ` [Qemu-devel] [RFC PATCH] qapi: split visit_end_struct() into pieces Eric Blake
2015-10-07 12:00             ` Markus Armbruster
2015-10-07 13:08               ` Markus Armbruster
2015-10-07 14:57               ` Eric Blake
2015-10-07 15:23                 ` Markus Armbruster
2015-09-26 21:41     ` [Qemu-devel] [PATCH v5 07/46] qapi: Don't pass pre-existing error to later call Eric Blake
2015-09-27  2:26       ` Eric Blake
2015-09-28  9:24       ` Markus Armbruster
2015-09-21 21:57 ` [Qemu-devel] [PATCH v5 08/46] qapi: Reuse code for flat union base validation Eric Blake
2015-09-25 16:30   ` Markus Armbruster
2015-09-21 21:57 ` [Qemu-devel] [PATCH v5 09/46] qapi: Use consistent generated code patterns Eric Blake
2015-09-25 16:54   ` Markus Armbruster
2015-09-25 19:06     ` Eric Blake
2015-09-21 21:57 ` [Qemu-devel] [PATCH v5 10/46] qapi: Merge generation of per-member visits Eric Blake
2015-09-28  6:17   ` Markus Armbruster
2015-09-28 15:40     ` Eric Blake
2015-09-29  7:37       ` Markus Armbruster
2015-09-21 21:57 ` [Qemu-devel] [PATCH v5 11/46] qapi: Don't use info as witness of implicit object type Eric Blake
2015-09-28 12:43   ` Markus Armbruster
2015-09-29  3:58     ` Eric Blake
2015-09-29  7:51       ` Markus Armbruster
2015-09-30  4:13         ` [Qemu-devel] [RFC PATCH] qapi: Use callback to determine visit filtering Eric Blake
2015-10-01  6:12           ` Markus Armbruster
2015-10-01 14:09             ` Eric Blake
2015-09-21 21:57 ` [Qemu-devel] [PATCH v5 12/46] qapi: Track location that created an implicit type Eric Blake
2015-09-28 12:56   ` Markus Armbruster
2015-09-29  4:03     ` Eric Blake
2015-09-29  8:02       ` Markus Armbruster
2015-09-30 16:02         ` Eric Blake
2015-09-21 21:57 ` [Qemu-devel] [PATCH v5 13/46] qapi: Track owner of each object member Eric Blake
2015-09-30 16:06   ` Eric Blake
2015-09-21 21:57 ` [Qemu-devel] [PATCH v5 14/46] qapi: Detect collisions in C member names Eric Blake
2015-09-21 21:57 ` [Qemu-devel] [PATCH v5 15/46] qapi: Defer duplicate member checks to schema check() Eric Blake
2015-09-21 21:57 ` [Qemu-devel] [PATCH v5 16/46] qapi: Detect base class loops Eric Blake
2015-09-21 21:57 ` [Qemu-devel] [PATCH v5 17/46] qapi: Provide nicer array names in introspection Eric Blake
2015-09-21 21:57 ` [Qemu-devel] [PATCH v5 18/46] qapi-introspect: Guarantee particular sorting Eric Blake
2015-09-21 21:57 ` [Qemu-devel] [PATCH v5 19/46] qapi: Simplify visiting of alternate types Eric Blake
2015-09-21 21:57 ` [Qemu-devel] [PATCH v5 20/46] qapi: Fix alternates that accept 'number' but not 'int' Eric Blake
2015-09-21 21:57 ` [Qemu-devel] [PATCH v5 21/46] qmp: Fix reference-counting of qnull on empty output visit Eric Blake
2015-09-21 21:57 ` [Qemu-devel] [PATCH v5 22/46] qapi: Don't abuse stack to track qmp-output root Eric Blake
2015-09-21 21:57 ` [Qemu-devel] [PATCH v5 23/46] qapi: Remove dead visitor code Eric Blake
2015-09-21 21:57 ` [Qemu-devel] [PATCH v5 24/46] qapi: Document visitor interfaces Eric Blake
2015-09-21 21:57 ` [Qemu-devel] [PATCH v5 25/46] qapi: Plug leaks in test-qmp-input-visitor Eric Blake
2015-09-21 21:57 ` [Qemu-devel] [PATCH v5 26/46] qapi: Test failure in middle of array parse Eric Blake
2015-09-21 21:57 ` [Qemu-devel] [PATCH v5 27/46] qapi: Simplify visits of optional fields Eric Blake
2015-09-21 21:57 ` [Qemu-devel] [PATCH v5 28/46] qapi: Rework deallocation of partial struct Eric Blake
2015-09-21 21:57 ` [Qemu-devel] [PATCH v5 29/46] qapi: Change visit_type_FOO() to no longer return partial objects Eric Blake
2015-09-21 21:57 ` [Qemu-devel] [PATCH v5 30/46] net: use Netdev instead of NetClientOptions in client init Eric Blake
2015-09-21 21:57 ` [Qemu-devel] [PATCH v5 31/46] qapi: use 'type' in generated C code to match QMP union wire form Eric Blake
2015-09-21 21:57 ` [Qemu-devel] [PATCH v5 32/46] qapi: Hide tag_name data member of variants Eric Blake
2015-09-21 21:57 ` [Qemu-devel] [PATCH v5 33/46] vnc: hoist allocation of VncBasicInfo to callers Eric Blake
2015-09-21 21:57 ` [Qemu-devel] [PATCH v5 34/46] qapi: Unbox base members Eric Blake
2015-09-21 21:57 ` [Qemu-devel] [PATCH v5 35/46] qapi-visit: Remove redundant functions for flat union base Eric Blake
2015-09-23 20:55   ` Eric Blake
2015-09-21 21:57 ` [Qemu-devel] [PATCH v5 36/46] qapi: Avoid use of 'data' member of qapi unions Eric Blake
2015-09-21 21:57 ` [Qemu-devel] [PATCH v5 37/46] qapi: Forbid empty unions and useless alternates Eric Blake
2015-09-21 21:57 ` [Qemu-devel] [PATCH v5 38/46] qapi: Drop useless 'data' member of unions Eric Blake
2015-09-21 21:57 ` [Qemu-devel] [PATCH v5 39/46] qapi: Plumb in 'box' to qapi generator lower levels Eric Blake
2015-09-21 21:57 ` [Qemu-devel] [PATCH v5 40/46] qapi: Implement boxed structs for commands/events Eric Blake
2015-09-21 21:57 ` [Qemu-devel] [PATCH v5 41/46] qapi: Support boxed unions Eric Blake
2015-09-21 21:57 ` [Qemu-devel] [PATCH v5 42/46] qapi: support implicit structs in OptsVisitor Eric Blake
2015-09-21 21:57 ` [Qemu-devel] [PATCH v5 43/46] qapi: Change Netdev into a flat union Eric Blake
2015-09-21 21:58 ` [Qemu-devel] [PATCH v5 44/46] net: Use correct type for bool flag Eric Blake
2015-09-21 21:58 ` [Qemu-devel] [PATCH v5 45/46] net: Complete qapi-fication of netdev_add Eric Blake
2015-09-23 15:40   ` Paolo Bonzini
2015-09-23 16:37     ` Eric Blake
2015-09-25 16:48       ` Paolo Bonzini
2015-09-28  9:31         ` Markus Armbruster
2015-09-28 11:29           ` Paolo Bonzini
2015-09-21 21:58 ` [Qemu-devel] [PATCH v5 46/46] qapi: Allow anonymous base for flat union Eric Blake
2015-09-23 20:59   ` Eric Blake
2015-09-28 13:07 ` [Qemu-devel] [PATCH v5 00/46] post-introspection cleanups, and qapi-ify netdev_add Markus Armbruster
2015-09-29  3:43   ` Eric Blake

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=5604216D.2010509@redhat.com \
    --to=eblake@redhat.com \
    --cc=DirtY.iCE.hu@gmail.com \
    --cc=armbru@redhat.com \
    --cc=ehabkost@redhat.com \
    --cc=marcandre.lureau@redhat.com \
    --cc=mdroth@linux.vnet.ibm.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).