[virt-tools-list] [vhostmd PATCH 3/3] Add a timeout to the metrics request and fix the timeout value.

Trapp, Michael michael.trapp at sap.com
Mon Mar 18 08:23:04 UTC 2019


On 15.03.19, 18:42, "Jim Fehlig" <jfehlig at suse.com> wrote:

    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?

I've seen this situation due to an invalid setup on the hypervisor.

Regards
Michael
    
    > ---
    >   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