time_based: Avoid restarting main I/O loop
[fio.git] / io_u.c
diff --git a/io_u.c b/io_u.c
index ba6757993a403ee34b11a222317460c4818a9dd7..65a144d3ad517c86a5e45386bc818a2293f38d2a 100644 (file)
--- a/io_u.c
+++ b/io_u.c
@@ -237,13 +237,18 @@ ret:
 static int get_next_rand_block(struct thread_data *td, struct fio_file *f,
                               enum fio_ddir ddir, unsigned long long *b)
 {
-       if (get_next_rand_offset(td, f, ddir, b)) {
-               dprint(FD_IO, "%s: rand offset failed, last=%llu, size=%llu\n",
-                               f->file_name, f->last_pos, f->real_file_size);
-               return 1;
+       if (!get_next_rand_offset(td, f, ddir, b))
+               return 0;
+
+       if (td->o.time_based) {
+               fio_file_reset(f);
+               if (!get_next_rand_offset(td, f, ddir, b))
+                       return 0;
        }
 
-       return 0;
+       dprint(FD_IO, "%s: rand offset failed, last=%llu, size=%llu\n",
+                       f->file_name, f->last_pos, f->real_file_size);
+       return 1;
 }
 
 static int get_next_seq_block(struct thread_data *td, struct fio_file *f,
@@ -251,6 +256,9 @@ static int get_next_seq_block(struct thread_data *td, struct fio_file *f,
 {
        assert(ddir_rw(ddir));
 
+       if (f->last_pos >= f->io_size && td->o.time_based)
+               f->last_pos = f->last_pos - f->io_size;
+
        if (f->last_pos < f->real_file_size) {
                unsigned long long pos;