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


_______________________________________________
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