On Thu, Aug 30, 2012 at 12:04 AM, Amos Kong <kongjian...@gmail.com> wrote:

> On Wed, Aug 29, 2012 at 11:15 PM, Amos Kong <kongjian...@gmail.com> wrote:
> > On Thu, Feb 23, 2012 at 4:15 PM, Markus Armbruster <arm...@redhat.com>
> wrote:
> >>
> >> Anthony Liguori <anth...@codemonkey.ws> writes:
> >>
> >> > On 02/15/2012 07:33 AM, Markus Armbruster wrote:
> >> >> Anthony Liguori<anth...@codemonkey.ws>  writes:
> >> >>
> >> >>> On 02/14/2012 11:24 AM, Markus Armbruster wrote:
> >> >>>> Markus Armbruster<arm...@redhat.com>   writes:
> >> >>>>
> >> >>>>> Anthony Liguori<aligu...@us.ibm.com>   writes:
> >> >>>> [Anthony asking for error_set() instead of error_report()...]
> >> >>>>>> Basically, same thing here and the remaining functions.  Let's
> not
> >> >>>>>> introduce additional uses of error_report().
> >> >>>>>>
> >> >>>>>> That said, I imagine you don't want to introduce a bunch of error
> >> >>>>>> types for these different things and that's probably not
> productive
> >> >>>>>> anyway.
> >> >>>> [...]
> >> >>>>>> So let's compromise and introduce a generic QERR_INTERNAL_ERROR
> that
> >> >>>>>> takes a single human readable string as an argument.  We can
> have a
> >> >>>>>> wrapper for it that also records location information in the
> error
> >> >>>>>> object.
> >
> >
> >
> >
> >
> >>
> >> >>>>> This series goes from stderr to error_report().  That's a
> relatively
> >> >>>>> simple step, which makes it relatively easy to review.  I'm afraid
> >> >>>>> moving all the way to error.h in one step wouldn't be as easy.
>  Kevin
> >> >>>>> suggests to do it in a follow-up series, and I agree.
> >> >>>
> >> >>> The trouble I have is not about doing things incrementally, but
> rather
> >> >>> touching a lot of code incrementally.  Most of the code you touch
> >> >>> could be done incrementally with error_set().
> >> >>>
> >> >>> For instance, you could touch inet_listen_opts() and just add an
> Error
> >> >>> ** as the last argument.  You can change all callers to simply do:
> >> >>>
> >> >>> Error *err = NULL;
> >> >>>
> >> >>> ...
> >> >>> inet_listen_opts(...,&err);
> >> >>> if (err) {
> >> >>>     error_report_err(err);
> >> >>>     return -1;
> >> >>> }
> >> >>>
> >> >>> And it's not really all that different from the series as it stands
> >> >>> today.  I agree that aggressively refactoring error propagation is
> >> >>> probably not necessary as a first step, but if we're going to touch
> a
> >> >>> lot of code, we should do it in a way that we don't have to
> >> >>> immediately touch it again next.
> >> >>
> >> >> Well, the series adds 47 calls of error_report() to five files out of
> >> >> 1850.
> >> >>
> >> >>>>> Can you point to an existing conversion from error_report() to
> error.h,
> >> >>>>> to give us an idea how it's supposed to be done?
> >> >>>>
> >> >>>> Ping?
> >> >>>
> >> >>> Sorry, I mentally responded bug neglected to actually respond.
> >> >>>
> >> >>> All of the QMP work that Luiz is doing effectively does this so
> there
> >> >>> are ample examples right now.  The change command is probably a good
> >> >>> place to start.
> >> >>
> >> >> Thanks.
> >> >>
> >> >> Unfortunately, I'm out of time on this one, so if you're unwilling to
> >> >> accept this admittedly incremental improvement without substantial
> >> >> rework, I'll have to let it rot in peace.
> >> >>
> >> >> We might want a QMP commands to add character devices some day.
>  Perhaps
> >> >> the person doing it will still be able to find these patches, and get
> >> >> some use out of them.
> >> >>
> >> >> Patches 01-08,14 don't add error_report() calls.  What about
> committing
> >> >> them?  The commit messages would need to be reworded not to promise
> >> >> goodies from the other patches, though.
> >> >
> >> > I'm sorry to hear that you can't continue working on this.
> >>
> >> Can't be helped.
> >
> >
> >
> > I want to continue working on this work (patch 9~13,15~19).
>


FYI, URL of the old thread:
http://lists.nongnu.org/archive/html/qemu-devel/2012-02/msg00714.html



> > Makus used error_report() to output the rich/meaningful error message
> > to monitor,
> > but Anthony prefers to use error_set(), right?
> >
> > I would like to introduce a generic QERR_INTERNAL_ERROR as Anthony
> > said to replace error_report().
>
>
> error_report() can be used many times/places, we might see many error
> in monitor.
> but error_set() can only set one kind of error when internal error
> occurs, and only
> one error will be printed into monitor.
>
> output final/important error by error_set()/error_report_err(), and
> output other error to stdio?
>
> ---
> There are some 'GENERIC ERROR CLASS' in qerror.h, which are not used
> very frequently, we can convert them to 'QERR_INTERNAL_ERROR'.
>
> Or convert all 'GENERIC ERROR CLASS' to  'QERR_INTERNAL_ERROR',
> and use a single human readable string?
>
> > Please help to review below RFC patch, thanks.
>
>
Anthony, Luiz, other

any comments?

archive of this patch:
http://lists.nongnu.org/archive/html/qemu-devel/2012-08/msg04927.html


> From 4b8200ce662dd375819fd24cb932e70131ce0bd3 Mon Sep 17 00:00:00 2001
> > From: Amos Kong <ak...@redhat.com>
> > Date: Wed, 29 Aug 2012 22:52:48 +0800
> > Subject: [PATCH RFC] qerror: introduce QERR_INTERNAL_ERROR
> >
> > Current qerror reporting infrastructure isn't agile,
> > we have to add a new Class for a new error.
> >
> > This patch introduced a generic QERR_INTERNAL_ERROR
> > that takes a single human readable string as an argument.
> >
> > This patch is a RFC, so I only changed some code of
> > inet_connect() as an example.
> >
> > hmp:
> > (qemu) migrate -d tcp:noname:4446
> > migrate: Can't resolve noname:4446: Name or service not known
> >
> > qmp:
> > { "execute": "migrate", "arguments": { "uri": "tcp:noname:4446" } }
> > {"error": {"class": "GenericError", "desc": "Can't resolve noname:4446:
> > Name or service not known"}}
> >
> > Signed-off-by: Amos Kong <ak...@redhat.com>
> > ---
> >  qemu-sockets.c |    9 +++++----
> >  qerror.h       |    3 +++
> >  2 files changed, 8 insertions(+), 4 deletions(-)
> >
> > diff --git a/qemu-sockets.c b/qemu-sockets.c
> > index 361d890..e528288 100644
> > --- a/qemu-sockets.c
> > +++ b/qemu-sockets.c
> > @@ -244,9 +244,9 @@ int inet_connect_opts(QemuOpts *opts, bool
> > *in_progress, Error **errp)
> >
> >      /* lookup */
> >      if (0 != (rc = getaddrinfo(addr, port, &ai, &res))) {
> > -        fprintf(stderr,"getaddrinfo(%s,%s): %s\n", addr, port,
> > -                gai_strerror(rc));
> > -        error_set(errp, QERR_SOCKET_CREATE_FAILED);
> > +        char err[50];
> > +        sprintf(err, "Can't resolve %s:%s: %s", addr, port,
> gai_strerror(rc));
> > +        error_set(errp, QERR_INTERNAL_ERROR, err);
> >         return -1;
> >      }
> >
> > @@ -505,7 +505,8 @@ int inet_connect(const char *str, bool block, bool
> > *in_progress, Error **errp)
> >          }
> >          sock = inet_connect_opts(opts, in_progress, errp);
> >      } else {
> > -        error_set(errp, QERR_SOCKET_CREATE_FAILED);
> > +        error_set(errp, QERR_INTERNAL_ERROR,
> > +                  "inet_connect: failed to parse address");
> >      }
> >      qemu_opts_del(opts);
> >      return sock;
> > diff --git a/qerror.h b/qerror.h
> > index d0a76a4..97bf5e0 100644
> > --- a/qerror.h
> > +++ b/qerror.h
> > @@ -246,4 +246,7 @@ void assert_no_error(Error *err);
> >  #define QERR_SOCKET_CREATE_FAILED \
> >      ERROR_CLASS_GENERIC_ERROR, "Failed to create socket"
> >
> > +#define QERR_INTERNAL_ERROR \
> > +    ERROR_CLASS_GENERIC_ERROR, "%s"
> > +
> >  #endif /* QERROR_H */
> > --
> > 1.7.1
> >
> >
> >
> >>
> >>
> >> > I'll focus on applying the patches you mentioned.
> >>
> >> Suggest to reword the commit messages not to promise the parts you don't
> >> apply.
> >>
> >> > While I admit that it seems counter intuitive to not want to improve
> >> > error messages (and I fully admit, that this is an improvement), I'm
> >> > more concerned that this digs us deeper into the
> >> > qerror_report/error_report hole that we're trying to dig our way out
> >> > of.
> >> >
> >> > If you want to add chardevs dynamically, then I assume your next patch
> >>
> >> Not a priority at this time, I'm afraid.  If it becomes one, I might be
> >> able to work on it.
> >>
> >> > would be switching error_report to qerror_report such that the errors
> >> > appeared in the monitor.  But this is wrong.  New QMP functions are
> >> > not allowed to use qerror_report anymore.  So all of this code would
> >> > need to get changed again anyway.
> >>
> >> No, the next step for errors would be error_report() -> error_set(),
> >> precisely because qerror_report() can't be used anymore.
> >>
> >> Yes, that means the five files that report chardev open errors will need
> >> to be touched again.  But that'll be a bog-standard error_report() ->
> >> error_set() conversion.  Easier to code, test and review than combined
> >> "track down all the error paths that fail to report errors, or report
> >> non-sensical errors" + "convert from fprintf() to error_set() in one
> >> go".
> >>
> >> In my opinion, the "have to touch five files again" developer burden
> >> compares quite favorably with "have to check all the error paths again"
> >> developer burden.  And in any case it's dwarved by the "have to use a
> >> debugger to find out what's wrong" user burden.
> >>
> >> [...]
> >>
>

Reply via email to