Skip to content

Commit

Permalink
qemu-char: Fix reconnect socket error reporting
Browse files Browse the repository at this point in the history
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 <cminyard@mvista.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
  • Loading branch information
cminyard authored and bonzini committed Oct 9, 2014
1 parent 5179502 commit 5008e5b
Showing 1 changed file with 34 additions and 18 deletions.
52 changes: 34 additions & 18 deletions qemu-char.c
Expand Up @@ -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);
Expand All @@ -2521,6 +2522,19 @@ static void qemu_chr_socket_restart_timer(CharDriverState *chr)
socket_reconnect_timeout, chr);
}

static void check_report_connect_error(CharDriverState *chr,
Error *err)
{
TCPCharDriver *s = chr->opaque;

if (!s->connect_err_reported) {
error_report("Unable to connect character device %s: %s",
chr->label, error_get_pretty(err));
s->connect_err_reported = true;
}
qemu_chr_socket_restart_timer(chr);
}

static gboolean tcp_chr_accept(GIOChannel *chan, GIOCondition cond, void *opaque);

#ifndef _WIN32
Expand Down Expand Up @@ -3045,14 +3059,14 @@ static void qemu_chr_finish_socket_connection(CharDriverState *chr, int fd)
static void qemu_chr_socket_connected(int fd, Error *err, void *opaque)
{
CharDriverState *chr = opaque;
TCPCharDriver *s = chr->opaque;

if (fd < 0) {
error_report("Unable to connect to char device %s: %s",
chr->label, error_get_pretty(err));
qemu_chr_socket_restart_timer(chr);
check_report_connect_error(chr, err);
return;
}

s->connect_err_reported = false;
qemu_chr_finish_socket_connection(chr, fd);
}

Expand Down Expand Up @@ -4068,23 +4082,27 @@ 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, err);
}
}

static gboolean socket_reconnect_timeout(gpointer opaque)
{
CharDriverState *chr = opaque;
TCPCharDriver *s = chr->opaque;
Error *err;

s->reconnect_timer = 0;

if (chr->be_open) {
return false;
}

if (!qemu_chr_open_socket_fd(chr, &err)) {
error_report("Unable to connect to char device %s: %s\n",
chr->label, error_get_pretty(err));
qemu_chr_socket_restart_timer(chr);
}
socket_try_connect(chr);

return false;
}
Expand Down Expand Up @@ -4136,15 +4154,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) {
Expand Down

0 comments on commit 5008e5b

Please sign in to comment.