d2787b
From 59e69ae1c7ccda74a8cbf8c9b2ae37bc74cbf612 Mon Sep 17 00:00:00 2001
d2787b
From: Ravishankar N <ravishankar@redhat.com>
d2787b
Date: Fri, 4 Jun 2021 10:55:37 +0530
d2787b
Subject: [PATCH 575/584] libglusterfs: add functions to calculate time
d2787b
 difference
d2787b
d2787b
Add gf_tvdiff() and gf_tsdiff() to calculate the difference
d2787b
between 'struct timeval' and 'struct timespec' values, use
d2787b
them where appropriate.
d2787b
d2787b
Upstream patch details:
d2787b
> https://github.com/gluster/glusterfs/commit/ba7f24b1cedf2549394c21b3f0df1661227cefae
d2787b
> Change-Id: I172be06ee84e99a1da76847c15e5ea3fbc059338
d2787b
> Signed-off-by: Dmitry Antipov <dmantipov@yandex.ru>
d2787b
> Updates: #1002
d2787b
d2787b
BUG: 1928676
d2787b
Change-Id: I723ab9555b0f8caef108742acc2cb63d6a32eb96
d2787b
Signed-off-by: Ravishankar N <ravishankar@redhat.com>
d2787b
Reviewed-on: https://code.engineering.redhat.com/gerrit/c/rhs-glusterfs/+/245294
d2787b
Tested-by: RHGS Build Bot <nigelb@redhat.com>
d2787b
Reviewed-by: Sunil Kumar Heggodu Gopala Acharya <sheggodu@redhat.com>
d2787b
---
d2787b
 glusterfsd/src/glusterfsd-mgmt.c          |  4 ++--
d2787b
 libglusterfs/src/glusterfs/common-utils.h | 32 +++++++++++++++++++++++++++++++
d2787b
 libglusterfs/src/latency.c                |  3 +--
d2787b
 xlators/cluster/dht/src/dht-rebalance.c   |  6 ++----
d2787b
 xlators/debug/io-stats/src/io-stats.c     |  8 ++------
d2787b
 5 files changed, 39 insertions(+), 14 deletions(-)
d2787b
d2787b
diff --git a/glusterfsd/src/glusterfsd-mgmt.c b/glusterfsd/src/glusterfsd-mgmt.c
d2787b
index 61d1b21..a51dd9e 100644
d2787b
--- a/glusterfsd/src/glusterfsd-mgmt.c
d2787b
+++ b/glusterfsd/src/glusterfsd-mgmt.c
d2787b
@@ -534,7 +534,7 @@ glusterfs_volume_top_write_perf(uint32_t blk_size, uint32_t blk_count,
d2787b
     }
d2787b
 
d2787b
     gettimeofday(&end, NULL);
d2787b
-    *time = (end.tv_sec - begin.tv_sec) * 1e6 + (end.tv_usec - begin.tv_usec);
d2787b
+    *time = gf_tvdiff(&begin, &end;;
d2787b
     *throughput = total_blks / *time;
d2787b
     gf_log("glusterd", GF_LOG_INFO,
d2787b
            "Throughput %.2f Mbps time %.2f secs "
d2787b
@@ -653,7 +653,7 @@ glusterfs_volume_top_read_perf(uint32_t blk_size, uint32_t blk_count,
d2787b
     }
d2787b
 
d2787b
     gettimeofday(&end, NULL);
d2787b
-    *time = (end.tv_sec - begin.tv_sec) * 1e6 + (end.tv_usec - begin.tv_usec);
d2787b
+    *time = gf_tvdiff(&begin, &end;;
d2787b
     *throughput = total_blks / *time;
d2787b
     gf_log("glusterd", GF_LOG_INFO,
d2787b
            "Throughput %.2f Mbps time %.2f secs "
d2787b
diff --git a/libglusterfs/src/glusterfs/common-utils.h b/libglusterfs/src/glusterfs/common-utils.h
d2787b
index 604afd0..bd48b6f 100644
d2787b
--- a/libglusterfs/src/glusterfs/common-utils.h
d2787b
+++ b/libglusterfs/src/glusterfs/common-utils.h
d2787b
@@ -1090,4 +1090,36 @@ find_xlator_option_in_cmd_args_t(const char *option_name, cmd_args_t *args);
d2787b
 int
d2787b
 gf_d_type_from_ia_type(ia_type_t type);
d2787b
 
d2787b
+/* Return delta value in microseconds. */
d2787b
+
d2787b
+static inline double
d2787b
+gf_tvdiff(struct timeval *start, struct timeval *end)
d2787b
+{
d2787b
+    struct timeval t;
d2787b
+
d2787b
+    if (start->tv_usec > end->tv_usec)
d2787b
+        t.tv_sec = end->tv_sec - 1, t.tv_usec = end->tv_usec + 1000000;
d2787b
+    else
d2787b
+        t.tv_sec = end->tv_sec, t.tv_usec = end->tv_usec;
d2787b
+
d2787b
+    return (double)(t.tv_sec - start->tv_sec) * 1e6 +
d2787b
+           (double)(t.tv_usec - start->tv_usec);
d2787b
+}
d2787b
+
d2787b
+/* Return delta value in nanoseconds. */
d2787b
+
d2787b
+static inline double
d2787b
+gf_tsdiff(struct timespec *start, struct timespec *end)
d2787b
+{
d2787b
+    struct timespec t;
d2787b
+
d2787b
+    if (start->tv_nsec > end->tv_nsec)
d2787b
+        t.tv_sec = end->tv_sec - 1, t.tv_nsec = end->tv_nsec + 1000000000;
d2787b
+    else
d2787b
+        t.tv_sec = end->tv_sec, t.tv_nsec = end->tv_nsec;
d2787b
+
d2787b
+    return (double)(t.tv_sec - start->tv_sec) * 1e9 +
d2787b
+           (double)(t.tv_nsec - start->tv_nsec);
d2787b
+}
d2787b
+
d2787b
 #endif /* _COMMON_UTILS_H */
d2787b
diff --git a/libglusterfs/src/latency.c b/libglusterfs/src/latency.c
d2787b
index e1e6de7..ce61399 100644
d2787b
--- a/libglusterfs/src/latency.c
d2787b
+++ b/libglusterfs/src/latency.c
d2787b
@@ -33,8 +33,7 @@ gf_update_latency(call_frame_t *frame)
d2787b
     if (!(begin->tv_sec && end->tv_sec))
d2787b
         goto out;
d2787b
 
d2787b
-    elapsed = (end->tv_sec - begin->tv_sec) * 1e9 +
d2787b
-              (end->tv_nsec - begin->tv_nsec);
d2787b
+    elapsed = gf_tsdiff(begin, end);
d2787b
 
d2787b
     if (frame->op < 0 || frame->op >= GF_FOP_MAXVALUE) {
d2787b
         gf_log("[core]", GF_LOG_WARNING, "Invalid frame op value: %d",
d2787b
diff --git a/xlators/cluster/dht/src/dht-rebalance.c b/xlators/cluster/dht/src/dht-rebalance.c
d2787b
index eab7558..e07dec0 100644
d2787b
--- a/xlators/cluster/dht/src/dht-rebalance.c
d2787b
+++ b/xlators/cluster/dht/src/dht-rebalance.c
d2787b
@@ -2927,8 +2927,7 @@ gf_defrag_migrate_single_file(void *opaque)
d2787b
 
d2787b
     if (defrag->stats == _gf_true) {
d2787b
         gettimeofday(&end, NULL);
d2787b
-        elapsed = (end.tv_sec - start.tv_sec) * 1e6 +
d2787b
-                  (end.tv_usec - start.tv_usec);
d2787b
+        elapsed = gf_tvdiff(&start, &end;;
d2787b
         gf_log(this->name, GF_LOG_INFO,
d2787b
                "Migration of "
d2787b
                "file:%s size:%" PRIu64
d2787b
@@ -3529,8 +3528,7 @@ gf_defrag_process_dir(xlator_t *this, gf_defrag_info_t *defrag, loc_t *loc,
d2787b
     }
d2787b
 
d2787b
     gettimeofday(&end, NULL);
d2787b
-    elapsed = (end.tv_sec - dir_start.tv_sec) * 1e6 +
d2787b
-              (end.tv_usec - dir_start.tv_usec);
d2787b
+    elapsed = gf_tvdiff(&dir_start, &end;;
d2787b
     gf_log(this->name, GF_LOG_INFO,
d2787b
            "Migration operation on dir %s took "
d2787b
            "%.2f secs",
d2787b
diff --git a/xlators/debug/io-stats/src/io-stats.c b/xlators/debug/io-stats/src/io-stats.c
d2787b
index 9b34895..8ad96fb 100644
d2787b
--- a/xlators/debug/io-stats/src/io-stats.c
d2787b
+++ b/xlators/debug/io-stats/src/io-stats.c
d2787b
@@ -281,9 +281,7 @@ is_fop_latency_started(call_frame_t *frame)
d2787b
         begin = &frame->begin;                                                 \
d2787b
         end = &frame->end;                                                     \
d2787b
                                                                                \
d2787b
-        elapsed = ((end->tv_sec - begin->tv_sec) * 1e9 +                       \
d2787b
-                   (end->tv_nsec - begin->tv_nsec)) /                          \
d2787b
-                  1000;                                                        \
d2787b
+        elapsed = gf_tsdiff(begin, end) / 1000.0;                              \
d2787b
         throughput = op_ret / elapsed;                                         \
d2787b
                                                                                \
d2787b
         conf = this->private;                                                  \
d2787b
@@ -1774,9 +1772,7 @@ update_ios_latency(struct ios_conf *conf, call_frame_t *frame,
d2787b
     begin = &frame->begin;
d2787b
     end = &frame->end;
d2787b
 
d2787b
-    elapsed = ((end->tv_sec - begin->tv_sec) * 1e9 +
d2787b
-               (end->tv_nsec - begin->tv_nsec)) /
d2787b
-              1000;
d2787b
+    elapsed = gf_tsdiff(begin, end) / 1000.0;
d2787b
 
d2787b
     update_ios_latency_stats(&conf->cumulative, elapsed, op);
d2787b
     update_ios_latency_stats(&conf->incremental, elapsed, op);
d2787b
-- 
d2787b
1.8.3.1
d2787b