A timeout in the send request part of dump_virtio_metrics() should prevent the send from looping forever. The timeout value is fixed to a reasonable value of 5 seconds. --- libmetrics/libmetrics.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/libmetrics/libmetrics.c b/libmetrics/libmetrics.c index d79a023..08a233f 100644 --- a/libmetrics/libmetrics.c +++ b/libmetrics/libmetrics.c @@ -788,7 +788,8 @@ static char *get_virtio_metrics(void) size_t pos; size_t buf_size = (1 << 16); const size_t req_len = (size_t) strlen(request); - const time_t start_time = time(NULL); + const time_t timeout = 5; + time_t end_time; response = calloc(1UL, buf_size); if (response == NULL) @@ -803,19 +804,27 @@ static char *get_virtio_metrics(void) } pos = 0; + end_time = time(NULL) + timeout; while (pos < req_len) { ssize_t len = write(fd, &request[pos], req_len - pos); if (len > 0) pos += (size_t) len; else { - if (errno == EAGAIN) + if (errno == EAGAIN) { usleep(10000); + if (time(NULL) > end_time) { + libmsg("%s(): Unable to send metrics request" + " - timeout after %us\n", __func__, timeout); + goto error; + } + } else goto error; } } pos = 0; + end_time = time(NULL) + timeout; do { ssize_t len = read(fd, &response[pos], buf_size - pos - 1); if (len > 0) { @@ -836,9 +845,9 @@ static char *get_virtio_metrics(void) } else { if (errno == EAGAIN) { usleep(10000); - if (time(NULL) > (start_time + 30)) { - libmsg("Error, unable to read metrics" - " - timeout after 30s\n"); + if (time(NULL) > end_time) { + libmsg("%s(): Unable to read metrics" + " - timeout after %us\n", __func__, timeout); goto error; } } else -- 2.17.2 (Apple Git-113) _______________________________________________ virt-tools-list mailing list virt-tools-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/virt-tools-list