iolog.c: fix inaccurate clat when replay trace
authorKookoo Gu <Zhimin.Gu@solidigm.com>
Wed, 26 Jul 2023 04:48:35 +0000 (12:48 +0800)
committerKookoo Gu <Zhimin.Gu@solidigm.com>
Thu, 27 Jul 2023 02:33:37 +0000 (10:33 +0800)
When do timestamp replay with high qd it will only reap the
completed commands when the qd reach the max iodepth, the commands
probably are finished long ago before command completion handling.

Fix is to use io_u_queued_complete instead of just usec_sleep in
iolog_delay

Signed-off-by: Kookoo Gu <Zhimin.Gu@solidigm.com>
iolog.c

diff --git a/iolog.c b/iolog.c
index cc2cbc65ef9b4079db84fdb1b9a4838986b7d37c..97ba43967f1cd96cb7c33d87d13f4fe75f2cc1d8 100644 (file)
--- a/iolog.c
+++ b/iolog.c
@@ -82,8 +82,8 @@ static void iolog_delay(struct thread_data *td, unsigned long delay)
 {
        uint64_t usec = utime_since_now(&td->last_issue);
        unsigned long orig_delay = delay;
-       uint64_t this_delay;
        struct timespec ts;
+       int ret = 0;
 
        if (delay < td->time_offset) {
                td->time_offset = 0;
@@ -97,13 +97,13 @@ static void iolog_delay(struct thread_data *td, unsigned long delay)
        delay -= usec;
 
        fio_gettime(&ts, NULL);
-       while (delay && !td->terminate) {
-               this_delay = delay;
-               if (this_delay > 500000)
-                       this_delay = 500000;
 
-               usec_sleep(td, this_delay);
-               delay -= this_delay;
+       while (delay && !td->terminate) {
+               ret = io_u_queued_complete(td, 0);
+               if (ret < 0)
+                       td_verror(td, -ret, "io_u_queued_complete");
+               if (utime_since_now(&ts) > delay)
+                       break;
        }
 
        usec = utime_since_now(&ts);