[virt-tools-list] [vhostmd PATCH 3/3] Add a timeout to the metrics request and fix the timeout value.
Jim Fehlig
jfehlig at suse.com
Fri Mar 15 17:41:56 UTC 2019
On 2/7/19 8:41 AM, Michael Trapp wrote:
> A timeout in the send request part of dump_virtio_metrics()
> should prevent the send from looping forever.
Did you experience that, or just being defensive?
> The timeout value is fixed to a reasonable value of 5 seconds.
I agree that 30 seconds is a bit excessive. I'll push this patch as well.
Regards,
Jim
> ---
> 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
>
More information about the virt-tools-list
mailing list