Fix IOPS logging for mixed read/write workloads
authorJens Axboe <axboe@kernel.dk>
Mon, 20 Feb 2012 19:19:28 +0000 (20:19 +0100)
committerJens Axboe <axboe@kernel.dk>
Mon, 20 Feb 2012 19:19:28 +0000 (20:19 +0100)
Similar to commit 5daa4ebe, but for the IOPS logging.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
stat.c

diff --git a/stat.c b/stat.c
index 68744281a92de519cbb1f350fb459dfcca517cfd..a02c5829a494cf330a9394e731c0802b83b8b567 100644 (file)
--- a/stat.c
+++ b/stat.c
@@ -1291,8 +1291,8 @@ void add_bw_sample(struct thread_data *td, enum fio_ddir ddir, unsigned int bs,
        spent = mtime_since(&td->bw_sample_time, t);
        if (spent < td->o.bw_avg_time)
                return;
-       
-       /* 
+
+       /*
         * Compute both read and write rates for the interval.
         */
        for (ddir = DDIR_READ; ddir <= DDIR_WRITE; ddir++) {
@@ -1327,13 +1327,24 @@ void add_iops_sample(struct thread_data *td, enum fio_ddir ddir,
        if (spent < td->o.iops_avg_time)
                return;
 
-       iops = ((td->this_io_blocks[ddir] - td->stat_io_blocks[ddir]) * 1000) / spent;
+       /*
+        * Compute both read and write rates for the interval.
+        */
+       for (ddir = DDIR_READ; ddir <= DDIR_WRITE; ddir++) {
+               uint64_t delta;
 
-       add_stat_sample(&ts->iops_stat[ddir], iops);
+               delta = td->this_io_blocks[ddir] - td->stat_io_blocks[ddir];
+               if (!delta)
+                       continue; /* No entries for interval */
+
+               iops = (delta * 1000) / spent;
+               add_stat_sample(&ts->iops_stat[ddir], iops);
 
-       if (td->iops_log)
-               add_log_sample(td, td->iops_log, iops, ddir, 0);
+               if (td->iops_log)
+                       add_log_sample(td, td->iops_log, iops, ddir, 0);
+
+               td->stat_io_bytes[ddir] = td->this_io_bytes[ddir];
+       }
 
        fio_gettime(&td->iops_sample_time, NULL);
-       td->stat_io_blocks[ddir] = td->this_io_blocks[ddir];
 }