From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38370) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xbq6Q-0004m9-EW for qemu-devel@nongnu.org; Wed, 08 Oct 2014 08:12:28 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Xbq6D-0004gt-7s for qemu-devel@nongnu.org; Wed, 08 Oct 2014 08:12:22 -0400 Received: from mail-yk0-x22d.google.com ([2607:f8b0:4002:c07::22d]:53590) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xbq6D-0004fk-3g for qemu-devel@nongnu.org; Wed, 08 Oct 2014 08:12:09 -0400 Received: by mail-yk0-f173.google.com with SMTP id 200so3742457ykr.32 for ; Wed, 08 Oct 2014 05:12:08 -0700 (PDT) Sender: Corey Minyard From: minyard@acm.org Date: Wed, 8 Oct 2014 07:11:55 -0500 Message-Id: <1412770316-5241-3-git-send-email-minyard@acm.org> In-Reply-To: <1412770316-5241-1-git-send-email-minyard@acm.org> References: <1412770316-5241-1-git-send-email-minyard@acm.org> Subject: [Qemu-devel] [PATCH 2/3] qemu-char: Fix reconnect socket error reporting List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: pbonzini@redhat.com, Corey Minyard From: Corey Minyard If reconnect was set, errors wouldn't always be reported. Fix that and also only report a connect error once until a connection has been made. The primary purpose of this is to tell the user that a connection failed so they can know they need to figure out what went wrong. So we don't want to spew too much out here, just enough so they know. Signed-off-by: Corey Minyard --- qemu-char.c | 57 ++++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 42 insertions(+), 15 deletions(-) diff --git a/qemu-char.c b/qemu-char.c index 62af0ef..83ff458 100644 --- a/qemu-char.c +++ b/qemu-char.c @@ -2509,6 +2509,7 @@ typedef struct { guint reconnect_timer; int64_t reconnect_time; + bool connect_err_reported; } TCPCharDriver; static gboolean socket_reconnect_timeout(gpointer opaque); @@ -2521,6 +2522,24 @@ static void qemu_chr_socket_restart_timer(CharDriverState *chr) socket_reconnect_timeout, chr); } +static void check_report_connect_error(CharDriverState *chr, + const char *fmt, ...) GCC_FMT_ATTR(2, 3); + +static void check_report_connect_error(CharDriverState *chr, + const char *fmt, ...) +{ + TCPCharDriver *s = chr->opaque; + + if (!s->connect_err_reported) { + va_list ap; + va_start(ap, fmt); + error_vreport(fmt, ap); + va_end(ap); + s->connect_err_reported = true; + } + qemu_chr_socket_restart_timer(chr); +} + static gboolean tcp_chr_accept(GIOChannel *chan, GIOCondition cond, void *opaque); #ifndef _WIN32 @@ -3045,12 +3064,15 @@ static void qemu_chr_finish_socket_connection(CharDriverState *chr, int fd) static void qemu_chr_socket_connected(int fd, void *opaque) { CharDriverState *chr = opaque; + TCPCharDriver *s = chr->opaque; if (fd < 0) { - qemu_chr_socket_restart_timer(chr); + check_report_connect_error(chr, "Unable to connect to socket %s", + chr->label); return; } + s->connect_err_reported = false; qemu_chr_finish_socket_connection(chr, fd); } @@ -4066,11 +4088,21 @@ static CharDriverState *qmp_chardev_open_parallel(ChardevHostdev *parallel, #endif /* WIN32 */ +static void socket_try_connect(CharDriverState *chr) +{ + Error *err = NULL; + + if (!qemu_chr_open_socket_fd(chr, &err)) { + check_report_connect_error(chr, + "Unable to start connect to socket %s: %s", + chr->label, error_get_pretty(err)); + } +} + static gboolean socket_reconnect_timeout(gpointer opaque) { CharDriverState *chr = opaque; TCPCharDriver *s = chr->opaque; - Error *err; s->reconnect_timer = 0; @@ -4078,10 +4110,7 @@ static gboolean socket_reconnect_timeout(gpointer opaque) return false; } - if (!qemu_chr_open_socket_fd(chr, &err)) { - error_report("Unable to connect to char device %s\n", chr->label); - qemu_chr_socket_restart_timer(chr); - } + socket_try_connect(chr); return false; } @@ -4133,15 +4162,13 @@ static CharDriverState *qmp_chardev_open_socket(ChardevSocket *sock, s->reconnect_time = reconnect; } - if (!qemu_chr_open_socket_fd(chr, errp)) { - if (s->reconnect_time) { - qemu_chr_socket_restart_timer(chr); - } else { - g_free(s); - g_free(chr->filename); - g_free(chr); - return NULL; - } + if (s->reconnect_time) { + socket_try_connect(chr); + } else if (!qemu_chr_open_socket_fd(chr, errp)) { + g_free(s); + g_free(chr->filename); + g_free(chr); + return NULL; } if (is_listen && is_waitconnect) { -- 1.8.3.1