Fix a couple of typos in fio2gnuplot.
[fio.git] / backend.c
index 8d16fe289c7ea814e63965e2a0da979766e26c51..00a23db6ecd1dfa6caaf98124605653bd2c85c97 100644 (file)
--- a/backend.c
+++ b/backend.c
@@ -642,6 +642,7 @@ static uint64_t do_io(struct thread_data *td)
        uint64_t bytes_done[DDIR_RWDIR_CNT] = { 0, 0, 0 };
        unsigned int i;
        int ret = 0;
+       uint64_t bytes_issued = 0;
 
        if (in_ramp_time(td))
                td_set_runstate(td, TD_RAMP);
@@ -675,6 +676,9 @@ static uint64_t do_io(struct thread_data *td)
                if (flow_threshold_exceeded(td))
                        continue;
 
+               if (bytes_issued >= (uint64_t) td->o.size)
+                       break;
+
                io_u = get_io_u(td);
                if (!io_u)
                        break;
@@ -708,6 +712,7 @@ static uint64_t do_io(struct thread_data *td)
                                int bytes = io_u->xfer_buflen - io_u->resid;
                                struct fio_file *f = io_u->file;
 
+                               bytes_issued += bytes;
                                /*
                                 * zero read, fail
                                 */
@@ -738,6 +743,7 @@ sync_done:
                                ret = io_u_sync_complete(td, io_u, bytes_done);
                                if (ret < 0)
                                        break;
+                               bytes_issued += io_u->xfer_buflen;
                        }
                        break;
                case FIO_Q_QUEUED:
@@ -748,6 +754,7 @@ sync_done:
                         */
                        if (td->io_ops->commit == NULL)
                                io_u_queued(td, io_u);
+                       bytes_issued += io_u->xfer_buflen;
                        break;
                case FIO_Q_BUSY:
                        requeue_io_u(td, &io_u);
@@ -1086,14 +1093,15 @@ static int keep_running(struct thread_data *td)
        return 0;
 }
 
-static int exec_string(const char *string)
+static int exec_string(struct thread_options *o, const char *string, const char *mode)
 {
-       int ret, newlen = strlen(string) + 1 + 8;
+       int ret, newlen = strlen(string) + strlen(o->name) + strlen(mode) + 9 + 1;
        char *str;
 
        str = malloc(newlen);
-       sprintf(str, "sh -c %s", string);
+       sprintf(str, "%s &> %s.%s.txt", string, o->name, mode);
 
+       log_info("%s : Saving output of %s in %s.%s.txt\n",o->name, mode, o->name, mode);
        ret = system(str);
        if (ret == -1)
                log_err("fio: exec of cmd <%s> failed\n", str);
@@ -1121,6 +1129,11 @@ static void *thread_main(void *data)
        } else
                td->pid = gettid();
 
+       /*
+        * fio_time_init() may not have been called yet if running as a server
+        */
+       fio_time_init();
+
        fio_local_clock_init(o->use_thread);
 
        dprint(FD_PROCESS, "jobs pid=%d started\n", (int) td->pid);
@@ -1274,7 +1287,7 @@ static void *thread_main(void *data)
        if (init_random_map(td))
                goto err;
 
-       if (o->exec_prerun && exec_string(o->exec_prerun))
+       if (o->exec_prerun && exec_string(o, o->exec_prerun, (const char *)"prerun"))
                goto err;
 
        if (o->pre_read) {
@@ -1397,7 +1410,7 @@ static void *thread_main(void *data)
 
        fio_mutex_up(writeout_mutex);
        if (o->exec_postrun)
-               exec_string(o->exec_postrun);
+               exec_string(o, o->exec_postrun, (const char *)"postrun");
 
        if (exitall_on_terminate)
                fio_terminate_threads(td->groupid);
@@ -1582,7 +1595,7 @@ static void run_threads(void)
 
        if (fio_gtod_offload && fio_start_gtod_thread())
                return;
-       
+
        fio_idle_prof_init();
 
        set_sig_handlers();