[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