fix early termination of runs caused by ramp_time > runtime
[fio.git] / fio.c
diff --git a/fio.c b/fio.c
index c18df12d70a874624e5a8b68a78f68bca7a5ea81..7aa55a8f7839bdbb3f08f192cf4990932e4da25f 100644 (file)
--- a/fio.c
+++ b/fio.c
@@ -343,6 +343,8 @@ static int check_min_rate(struct thread_data *td, struct timeval *now,
 
 static inline int runtime_exceeded(struct thread_data *td, struct timeval *t)
 {
+       if (in_ramp_time(td))
+               return 0;
        if (!td->o.timeout)
                return 0;
        if (mtime_since(&td->epoch, t) >= td->o.timeout * 1000)
@@ -452,21 +454,22 @@ static inline void update_tv_cache(struct thread_data *td)
                __update_tv_cache(td);
 }
 
-static int break_on_this_error(struct thread_data *td, int *retptr)
+static int break_on_this_error(struct thread_data *td, enum fio_ddir ddir,
+                              int *retptr)
 {
        int ret = *retptr;
 
        if (ret < 0 || td->error) {
                int err;
 
-               if (!td->o.continue_on_error)
-                       return 1;
-
                if (ret < 0)
                        err = -ret;
                else
                        err = td->error;
 
+               if (!(td->o.continue_on_error & td_error_type(ddir, err)))
+                       return 1;
+
                if (td_non_fatal_error(err)) {
                        /*
                         * Continue with the I/Os in case of
@@ -612,7 +615,7 @@ sync_done:
                        break;
                }
 
-               if (break_on_this_error(td, &ret))
+               if (break_on_this_error(td, io_u->ddir, &ret))
                        break;
 
                /*
@@ -678,6 +681,7 @@ static void do_io(struct thread_data *td)
                int min_evts = 0;
                struct io_u *io_u;
                int ret2, full;
+               enum fio_ddir ddir;
 
                if (td->terminate)
                        break;
@@ -696,6 +700,8 @@ static void do_io(struct thread_data *td)
                if (!io_u)
                        break;
 
+               ddir = io_u->ddir;
+
                /*
                 * Add verification end_io handler, if asked to verify
                 * a previously written file.
@@ -774,7 +780,7 @@ sync_done:
                        break;
                }
 
-               if (break_on_this_error(td, &ret))
+               if (break_on_this_error(td, ddir, &ret))
                        break;
 
                /*
@@ -936,7 +942,7 @@ static int init_io_u(struct thread_data *td)
                dprint(FD_MEM, "io_u alloc %p, index %u\n", io_u, i);
 
                if (!(td->io_ops->flags & FIO_NOIO)) {
-                       io_u->buf = p + max_bs * i;
+                       io_u->buf = p;
                        dprint(FD_MEM, "io_u %p, mem %p\n", io_u, io_u->buf);
 
                        if (td_write(td))
@@ -953,6 +959,7 @@ static int init_io_u(struct thread_data *td)
                io_u->index = i;
                io_u->flags = IO_U_F_FREE;
                flist_add(&io_u->list, &td->io_u_freelist);
+               p += max_bs;
        }
 
        return 0;
@@ -1243,9 +1250,12 @@ static void *thread_main(void *data)
                memcpy(&td->iops_sample_time, &td->start, sizeof(td->start));
                memcpy(&td->tv_cache, &td->start, sizeof(td->start));
 
-               if (td->o.ratemin[0] || td->o.ratemin[1])
-                       memcpy(&td->lastrate, &td->bw_sample_time,
-                                                       sizeof(td->lastrate));
+               if (td->o.ratemin[0] || td->o.ratemin[1]) {
+                       memcpy(&td->lastrate[0], &td->bw_sample_time,
+                                               sizeof(td->bw_sample_time));
+                       memcpy(&td->lastrate[1], &td->bw_sample_time,
+                                               sizeof(td->bw_sample_time));
+               }
 
                if (clear_state)
                        clear_io_state(td);
@@ -1789,8 +1799,8 @@ int exec_run(void)
                return 0;
 
        if (write_bw_log) {
-               setup_log(&agg_io_log[DDIR_READ]);
-               setup_log(&agg_io_log[DDIR_WRITE]);
+               setup_log(&agg_io_log[DDIR_READ], 0);
+               setup_log(&agg_io_log[DDIR_WRITE], 0);
        }
 
        startup_mutex = fio_mutex_init(0);