All of lore.kernel.org
 help / color / mirror / Atom feed
From: Amos Kong <akong@redhat.com>
To: Markus Armbruster <armbru@redhat.com>
Cc: kwolf@redhat.com, aliguori@us.ibm.com,
	Juan Quintela <quintela@redhat.com>,
	mdroth@linux.vnet.ibm.com, qemu-devel@nongnu.org,
	pbonzini@redhat.com, Luiz Capitulino <lcapitulino@redhat.com>,
	eblake@redhat.com
Subject: Re: [Qemu-devel] [PATCH 15/34] net: inet_connect(), inet_connect_opts(): return -errno
Date: Mon, 6 Aug 2012 02:52:24 -0400 (EDT)	[thread overview]
Message-ID: <1367352037.189763.1344235944455.JavaMail.root@redhat.com> (raw)
In-Reply-To: <877gthz41l.fsf@blackfin.pond.sub.org>



----- Original Message -----
> [cc: Juan & Amos]
> 
> Luiz Capitulino <lcapitulino@redhat.com> writes:
> 
> > On Wed,  1 Aug 2012 22:02:35 -0300
> > Luiz Capitulino <lcapitulino@redhat.com> wrote:
> >
> >> Next commit wants to use this.
> >> 
> >> Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
> >> ---
> >> 
> >> This patch is an interesting case, because one of the goal of the
> >> error
> >> format that's being replaced was that callers could use it to know
> >> the
> >> error cause (with error_is_type().
> >> 
> >> However, the new error format doesn't allow this as most errors
> >> are
> >> class GenericError. So, we'll have to use errno to know the error
> >> cause,
> >> this is the case of inet_connect() when called by
> >> tcp_start_outgoing_migration().
> >
> > I'm thinking in doing this differently. Instead of returning errno,
> > we
> > could have:
> >
> >  error_sete(Error **err, ErrorClass err_class, int err_no,
> >             const char *fmt, ...);
> >
> > Then we store err_no in Error, and also add error_get_errno().
> >
> > Comments?
> 
> Maybe that'll turn out to be useful elsewhere, but not here.
> 
> The purpose of PATCH 14+15 is to permit purging error_is_type() from
> tcp_start_outgoing_migration() in PATCH 16.  Let's have a look at all
> three patches together.
> 
> This is tcp_start_outgoing_migration() now:
> 
>     int tcp_start_outgoing_migration(MigrationState *s, const char
>     *host_port,
>                                      Error **errp)
>     {
>         s->get_error = socket_errno;
>         s->write = socket_write;
>         s->close = tcp_close;
> 
>         s->fd = inet_connect(host_port, false, errp);
> 
>         if (!error_is_set(errp)) {
>             migrate_fd_connect(s);
>         } else if (error_is_type(*errp,
>         QERR_SOCKET_CONNECT_IN_PROGRESS)) {
>             DPRINTF("connect in progress\n");
>             qemu_set_fd_handler2(s->fd, NULL, NULL,
>             tcp_wait_for_connect, s);
>         } else if (error_is_type(*errp, QERR_SOCKET_CREATE_FAILED)) {
>             DPRINTF("connect failed\n");
>             return -1;
>         } else if (error_is_type(*errp, QERR_SOCKET_CONNECT_FAILED))
>         {
>             DPRINTF("connect failed\n");
>             migrate_fd_error(s);
>             return -1;
>         } else {
>             DPRINTF("unknown error\n");
>             return -1;
>         }
> 
>         return 0;
>     }
> 
> Cases:
> 
> 1. Success
> 
>    Proceeed to migrate_fd_connect().
> 
> 2. QERR_SOCKET_CONNECT_IN_PROGRESS
> 
>    connect() failed with -EINPROGRESS.  Not actually an error.  Set
>    up
>    appropriate callback.
> 
> 3. QERR_SOCKET_CONNECT_FAILED
> 
>    getaddrinfo() succeeded, but could not connect() to any of the
>    addresses.  Fail migration with migrate_fd_error().
> 
> 4. QERR_SOCKET_CREATE_FAILED
> 
>    The error grabbag:
> 
>    * inet_parse() failed, or
> 
>    * inet_connect_opts() misses host and/or port (should never
>    happen)
> 
>    * getaddrinfo() failed
> 
>    Bug: neglects to migrate_fd_error()!  Broken in commit d5c5dacc.


Before commit d5c5dacc,  migrate_fd_error() would not be called
when fail to create socket.

-    s->fd = qemu_socket(PF_INET, SOCK_STREAM, 0);
-    if (s->fd == -1) {
-        DPRINTF("Unable to open socket");
-        return -socket_error();
-    }


If you call migrate_fd_error() in this situation, qemu would hang.


> 5. Anything else
> 
>    Should never happen.  Handled exactly like 4.
> 
> If I undo d5c5dacc's damage (untested), it looks like this:
> 
>     int tcp_start_outgoing_migration(MigrationState *s, const char
>     *host_port,
>                                      Error **errp)
>     {
>         s->get_error = socket_errno;
>         s->write = socket_write;
>         s->close = tcp_close;
> 
>         s->fd = inet_connect(host_port, false, errp);
> 
>         if (!error_is_set(errp)) {
>             migrate_fd_connect(s);
>         } else if (error_is_type(*errp,
>         QERR_SOCKET_CONNECT_IN_PROGRESS)) {
>             DPRINTF("connect in progress\n");
>             qemu_set_fd_handler2(s->fd, NULL, NULL,
>             tcp_wait_for_connect, s);
>         } else {
>             DPRINTF("connect failed\n");
>             migrate_fd_error(s);

qemu would hang if socket isn't created successfully.

>             return -1;
>         }
> 
>         return 0;
>     }
> 
> Et voilà, the only error_is_type() is the non-error "in progress",
> and
> your new in_progress covers that already, no need for an errno.
>

  parent reply	other threads:[~2012-08-06  6:52 UTC|newest]

Thread overview: 85+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-08-02  1:02 [Qemu-devel] [PATCH v1 00/34]: add new error format Luiz Capitulino
2012-08-02  1:02 ` [Qemu-devel] [PATCH 01/34] monitor: drop unused monitor debug code Luiz Capitulino
2012-08-02  1:02 ` [Qemu-devel] [PATCH 02/34] qerror: QERR_AMBIGUOUS_PATH: drop %(object) from human msg Luiz Capitulino
2012-08-02  1:02 ` [Qemu-devel] [PATCH 03/34] qerror: QERR_DEVICE_ENCRYPTED: add filename info to " Luiz Capitulino
2012-08-02  1:02 ` [Qemu-devel] [PATCH 04/34] qerror: reduce public exposure Luiz Capitulino
2012-08-02  1:02 ` [Qemu-devel] [PATCH 05/34] qerror: drop qerror_abort() Luiz Capitulino
2012-08-02  1:02 ` [Qemu-devel] [PATCH 06/34] qerror: avoid passing qerr pointer Luiz Capitulino
2012-08-02 11:23   ` Markus Armbruster
2012-08-02 13:44     ` Luiz Capitulino
2012-08-02  1:02 ` [Qemu-devel] [PATCH 07/34] qerror: QError: drop file, linenr, func Luiz Capitulino
2012-08-02  1:02 ` [Qemu-devel] [PATCH 08/34] qerror: qerror_format(): return an allocated string Luiz Capitulino
2012-08-02  1:02 ` [Qemu-devel] [PATCH 09/34] qerror: don't delay error message construction Luiz Capitulino
2012-08-02  1:02 ` [Qemu-devel] [PATCH 10/34] error: " Luiz Capitulino
2012-08-02  1:02 ` [Qemu-devel] [PATCH 11/34] qmp: query-block: add 'valid_encryption_key' field Luiz Capitulino
2012-08-02 11:35   ` Markus Armbruster
2012-08-02 13:54     ` Luiz Capitulino
2012-08-10  7:56       ` Markus Armbruster
2012-08-10 13:33         ` Luiz Capitulino
2012-08-10 16:35           ` Markus Armbruster
2012-08-10 17:00             ` Luiz Capitulino
2012-08-10 17:17               ` Markus Armbruster
2012-08-10 17:50                 ` Luiz Capitulino
2012-08-11  7:45                   ` Markus Armbruster
2012-08-13 13:35                     ` Luiz Capitulino
2012-08-13 13:50                       ` Markus Armbruster
2012-08-13 14:02                         ` Luiz Capitulino
2012-08-02  1:02 ` [Qemu-devel] [PATCH 12/34] hmp: hmp_cont(): don't rely on QERR_DEVICE_ENCRYPTED Luiz Capitulino
2012-08-02 11:53   ` Markus Armbruster
2012-08-02 14:22     ` Luiz Capitulino
2012-08-10  8:42       ` Markus Armbruster
2012-08-10 14:22         ` Luiz Capitulino
2012-08-10 16:37           ` Markus Armbruster
2012-08-02  1:02 ` [Qemu-devel] [PATCH 13/34] hmp: hmp_change(): " Luiz Capitulino
2012-08-02 13:27   ` Markus Armbruster
2012-08-02 13:46     ` Paolo Bonzini
2012-08-02 13:53       ` Markus Armbruster
2012-08-02 13:57         ` Paolo Bonzini
2012-08-02 14:53           ` Luiz Capitulino
2012-08-02 14:51       ` Luiz Capitulino
2012-08-02 14:42     ` Luiz Capitulino
2012-08-02  1:02 ` [Qemu-devel] [PATCH 14/34] net: inet_connect(), inet_connect_opts(): add in_progress argument Luiz Capitulino
2012-08-02 15:12   ` Markus Armbruster
2012-08-02  1:02 ` [Qemu-devel] [PATCH 15/34] net: inet_connect(), inet_connect_opts(): return -errno Luiz Capitulino
2012-08-02 13:41   ` Luiz Capitulino
2012-08-02 15:50     ` Markus Armbruster
2012-08-02 16:49       ` Luiz Capitulino
2012-08-06  6:52       ` Amos Kong [this message]
2012-08-06 19:59         ` Luiz Capitulino
2012-08-02  1:02 ` [Qemu-devel] [PATCH 16/34] migration: don't rely on QERR_SOCKET_* Luiz Capitulino
2012-08-02  1:02 ` [Qemu-devel] [PATCH 17/34] qerror: drop QERR_SOCKET_CONNECT_IN_PROGRESS Luiz Capitulino
2012-08-02 15:58   ` Markus Armbruster
2012-08-06  7:04     ` Amos Kong
2012-08-02 16:54   ` Michael Roth
2012-08-02 17:08     ` Luiz Capitulino
2012-08-03 18:26       ` Michael Roth
2012-08-03 20:31         ` Luiz Capitulino
2012-08-02  1:02 ` [Qemu-devel] [PATCH 18/34] error: drop unused functions Luiz Capitulino
2012-08-02  1:02 ` [Qemu-devel] [PATCH 19/34] block: block_int: include qerror.h Luiz Capitulino
2012-08-02  1:02 ` [Qemu-devel] [PATCH 20/34] hmp: hmp.h: include qdict.h Luiz Capitulino
2012-08-02  1:02 ` [Qemu-devel] [PATCH 21/34] qapi: qapi-types.h: don't include qapi/qapi-types-core.h Luiz Capitulino
2012-08-02  1:02 ` [Qemu-devel] [PATCH 22/34] qapi: generate correct enum names for camel case enums Luiz Capitulino
2012-08-02  1:02 ` [Qemu-devel] [PATCH 23/34] qapi: don't convert enum strings to lowercase Luiz Capitulino
2012-08-02  1:02 ` [Qemu-devel] [PATCH 24/34] qapi-schema: add ErrorClass enum Luiz Capitulino
2012-08-02  1:02 ` [Qemu-devel] [PATCH 25/34] qerror: qerror_table: don't use C99 struct initializers Luiz Capitulino
2012-08-02 16:48   ` Markus Armbruster
2012-08-02  1:02 ` [Qemu-devel] [PATCH 26/34] error, qerror: add ErrorClass argument to error functions Luiz Capitulino
2012-08-02 16:57   ` Markus Armbruster
2012-08-02  1:02 ` [Qemu-devel] [PATCH 27/34] qerror: add proper ErrorClass value for QERR_ macros Luiz Capitulino
2012-08-02 17:01   ` Markus Armbruster
2012-08-02  1:02 ` [Qemu-devel] [PATCH 28/34] error: add error_get_class() Luiz Capitulino
2012-08-02  1:02 ` [Qemu-devel] [PATCH 29/34] qmp: switch to the new error format on the wire Luiz Capitulino
2012-08-02 17:12   ` Markus Armbruster
2012-08-02 17:19     ` Luiz Capitulino
2012-08-02  1:02 ` [Qemu-devel] [PATCH 30/34] qemu-ga: " Luiz Capitulino
2012-08-03 17:44   ` Michael Roth
2012-08-03 17:56     ` Eric Blake
2012-08-03 18:02       ` Luiz Capitulino
2012-08-02  1:02 ` [Qemu-devel] [PATCH 31/34] error, qerror: pass desc string to error calls Luiz Capitulino
2012-08-02 17:19   ` Markus Armbruster
2012-08-02  1:02 ` [Qemu-devel] [PATCH 32/34] qerror: drop qerror_table and qerror_format() Luiz Capitulino
2012-08-02  1:02 ` [Qemu-devel] [PATCH 33/34] error: drop error_get_qobject()/error_set_qobject() Luiz Capitulino
2012-08-02 17:20   ` Markus Armbruster
2012-08-02  1:02 ` [Qemu-devel] [PATCH 34/34] error, qerror: drop QDict member Luiz Capitulino
2012-08-02 13:41 ` [Qemu-devel] [PATCH v1 00/34]: add new error format Luiz Capitulino
2012-08-02 17:22 ` 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=1367352037.189763.1344235944455.JavaMail.root@redhat.com \
    --to=akong@redhat.com \
    --cc=aliguori@us.ibm.com \
    --cc=armbru@redhat.com \
    --cc=eblake@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=lcapitulino@redhat.com \
    --cc=mdroth@linux.vnet.ibm.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=quintela@redhat.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.