From: Laszlo Ersek <lersek@redhat.com>
To: Markus Armbruster <armbru@redhat.com>
Cc: "Peter Maydell" <peter.maydell@linaro.org>,
qemu-devel@nongnu.org,
"Dr. David Alan Gilbert" <dgilbert@redhat.com>,
"Peter Crosthwaite" <crosthwaitepeter@gmail.com>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Andreas Färber" <afaerber@suse.de>
Subject: Re: [Qemu-devel] Error handling in realize() methods
Date: Thu, 10 Dec 2015 12:10:31 +0100 [thread overview]
Message-ID: <56695DA7.2030908@redhat.com> (raw)
In-Reply-To: <87io46mzda.fsf@blackfin.pond.sub.org>
On 12/10/15 10:22, Markus Armbruster wrote:
> Laszlo Ersek <lersek@redhat.com> writes:
>
>> I've been following this discussion with great interest.
>>
>> My opinion should not be considered, because I won't be turning my
>> opinion into new code, or an agreement to support / maintain code. :)
>>
>> My opinion is that
>> - every single allocation needs to be checked rigorously,
>> - any partial construction of a more complex object needs to be rolled
>> back in precise reverse order upon encountering any kind of failure
>> (not just allocation)
>> - this should occur regardless of testing coverage (although projects
>> exist (for example, SQLite, IIRC) that use random or systematic
>> malloc() error injection in their test suite, for good coverage)
>> - the primary requirements for this to work are:
>> - a clear notion of ownership at any point in the code
>> - a disciplined approach to ownership tracking; for example, a helper
>> callee (responsible for constructing a member of a more complex
>> object) is forbidden from releasing "sibling" resources allocated
>> by the caller
>>
>> This is possible to do (I'm doing it and enforcing it in OVMF), but it
>> takes a lot of discipline, and *historically* the QEMU codebase has
>> stunk, whenever I've looked at its ownership tracking during
>> construction of objects.
>
> Doing it from the start is one thing. Laudable in theory, justifiable
> in practice for some applications (I've seen it done for a satellite's
> avionics software), but in general, life's too short for that kind of
> manual error handling.
>
> Retrofitting it into a big & messy existing code base is another thing
> entirely. Believe me, I've done my share of cleaning up stuff. When
> you're tempted to mess with something that works (although you barely
> understand how or even why) to make it neater, or easier to maintain, or
> handle vanishingly rare errors more gracefully, the one thing you need
> to know is when *not* to do it, because the risk of you fscking it up
> outweighs whatever you hope to gain.
I agree. :)
Thanks
Laszlo
>
>> I feel that in the last sequence of months (years?) the developer
>> discipline and the codebase have improved a *great* deal. Still I cannot
>> say how feasible it would be to bring all existent code into conformance
>> with the above.
>
> Hah! We can't even get all the existent qdev init() methods converted
> to realize(), which is a *much* simpler task. And that conveniently
> ignores all the code that hasn't even made it to qdev.
>
> We got bigger fish to fry. In fact, the queue of fish waiting to be
> fried goes along the block a couple of times.
>
>> ... As I said, I just wanted to express this opinion as another (not
>> really practical) data point. My children utterly hate spinach, so
>> Markus's counterpoint is definitely not lost on me.
>
> To anyone advocating creating thousands (or even dozens) of non-trivial
> new error paths: come back with a test suite. We have mountains of
> evidence for chronic inability to get error paths right. In fact, I'm
> working on a patch that adds a bunch of FIXMEs for one class of flawed
> error recovery. Just FIXMEs, because I don't dare fixing the bugs
> myself without a way to test the fix, and the fishes in the queue are
> looking at me accusingly already.
>
> If I may suggest a logo for such a test suite: kids eating spinach with
> a smile feel apt.
>
next prev parent reply other threads:[~2015-12-10 11:10 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-12-08 13:47 [Qemu-devel] Error handling in realize() methods Markus Armbruster
2015-12-08 14:19 ` Dr. David Alan Gilbert
2015-12-09 9:30 ` Markus Armbruster
2015-12-09 10:29 ` Dr. David Alan Gilbert
2015-12-09 11:10 ` Laszlo Ersek
2015-12-10 9:22 ` Markus Armbruster
2015-12-10 11:10 ` Laszlo Ersek [this message]
2015-12-09 11:47 ` Peter Maydell
2015-12-09 12:25 ` Laszlo Ersek
2015-12-09 13:21 ` Dr. David Alan Gilbert
2015-12-10 9:27 ` Markus Armbruster
2015-12-09 13:09 ` Paolo Bonzini
2015-12-09 13:12 ` Dr. David Alan Gilbert
2015-12-09 13:43 ` Paolo Bonzini
2015-12-10 11:06 ` Markus Armbruster
2015-12-10 11:21 ` Dr. David Alan Gilbert
2015-12-10 11:22 ` Paolo Bonzini
2015-12-10 11:26 ` Paolo Bonzini
2015-12-10 12:25 ` Markus Armbruster
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=56695DA7.2030908@redhat.com \
--to=lersek@redhat.com \
--cc=afaerber@suse.de \
--cc=armbru@redhat.com \
--cc=crosthwaitepeter@gmail.com \
--cc=dgilbert@redhat.com \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--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).