Re: [vhostmd PATCH 3/3] Add a timeout to the metrics request and fix the timeout value.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 15.03.19, 18:42, "Jim Fehlig" <jfehlig@xxxxxxxx> 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
    > 
    
    


_______________________________________________
virt-tools-list mailing list
virt-tools-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/virt-tools-list




[Index of Archives]     [Linux Virtualization]     [KVM Development]     [CentOS Virtualization]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite Forum]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]     [Video 4 Linux]

  Powered by Linux