flush is usually called once but in some cases most of the time is spent
in so we cannot ignore it.

Here is an example run with this change:

$ ./nbdkit --foreground \
    --unix /tmp/nbd.sock \
    --exportname '' \
    --filter stats \
    file file=/var/tmp/dst.img \
    statsfile=/dev/stderr \
    --run 'qemu-img convert -p -n -f raw -O raw -T none /var/tmp/fedora-30.img 
nbd:unix:/tmp/nbd.sock'
    (100.00/100%)
elapsed time: 2.107 s
write: 1271 ops, 1.14 GiB, 0.356 s, 3262.38 MiB/s
zero: 1027 ops, 4.86 GiB, 0.013 s, 390318.00 MiB/s
extents: 1 ops, 2.00 GiB, 0.000 s, 68266650.39 MiB/s
flush: 2 ops, 1.021 s
---
 filters/stats/stats.c | 29 +++++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)

diff --git a/filters/stats/stats.c b/filters/stats/stats.c
index 86439e7..25e425b 100644
--- a/filters/stats/stats.c
+++ b/filters/stats/stats.c
@@ -66,6 +66,7 @@ static uint64_t trim_ops, trim_bytes, trim_usecs;
 static uint64_t zero_ops, zero_bytes, zero_usecs;
 static uint64_t extents_ops, extents_bytes, extents_usecs;
 static uint64_t cache_ops, cache_bytes, cache_usecs;
+static uint64_t flush_ops, flush_usecs;
 
 static inline double
 calc_mibps (uint64_t bytes, int64_t usecs)
@@ -96,6 +97,9 @@ print_stats (int64_t usecs)
   if (cache_ops > 0)
     fprintf (fp, "cache: %" PRIu64 " ops, %.2f GiB, %.3f s, %.2f MiB/s\n",
              cache_ops, cache_bytes / GiB, cache_usecs / USEC, calc_mibps 
(cache_bytes, cache_usecs));
+  if (flush_ops > 0)
+    fprintf (fp, "flush: %" PRIu64 " ops, %.3f s\n",
+             flush_ops, flush_usecs / USEC);
 
   fflush (fp);
 }
@@ -254,6 +258,30 @@ stats_trim (struct nbdkit_next_ops *next_ops, void *nxdata,
   return r;
 }
 
+/* Flush. */
+static int
+stats_flush (struct nbdkit_next_ops *next_ops, void *nxdata,
+             void *handle, uint32_t flags,
+             int *err)
+{
+  struct timeval start, end;
+  int64_t usecs;
+  int r;
+
+  gettimeofday (&start, NULL);
+  r = next_ops->flush (nxdata, flags, err);
+  if (r == 0) {
+    gettimeofday (&end, NULL);
+    usecs = tvdiff_usec(&start, &end);
+
+    ACQUIRE_LOCK_FOR_CURRENT_SCOPE (&lock);
+    flush_ops++;
+    flush_usecs += usecs;
+  }
+
+  return r;
+}
+
 /* Zero. */
 static int
 stats_zero (struct nbdkit_next_ops *next_ops, void *nxdata,
@@ -343,6 +371,7 @@ static struct nbdkit_filter filter = {
   .pread             = stats_pread,
   .pwrite            = stats_pwrite,
   .trim              = stats_trim,
+  .flush             = stats_flush,
   .zero              = stats_zero,
   .extents           = stats_extents,
   .cache             = stats_cache,
-- 
2.21.0


_______________________________________________
Libguestfs mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/libguestfs

Reply via email to