crc/test: add fnv
[fio.git] / backend.c
index 23fa345b7e19496ae64af4a0bfa8983ddaefe794..981625b61095dd42995d32291ec3fdc4b58cb597 100644 (file)
--- a/backend.c
+++ b/backend.c
@@ -53,6 +53,7 @@
 #include "lib/getrusage.h"
 #include "idletime.h"
 #include "err.h"
+#include "lib/tp.h"
 
 static pthread_t disk_util_thread;
 static struct fio_mutex *disk_thread_mutex;
@@ -390,7 +391,7 @@ static int break_on_this_error(struct thread_data *td, enum fio_ddir ddir,
                         * fill_device option is set.
                         */
                        td_clear_error(td);
-                       td->terminate = 1;
+                       fio_mark_td_terminate(td);
                        return 1;
                } else {
                        /*
@@ -459,7 +460,7 @@ static void do_verify(struct thread_data *td, uint64_t verify_bytes)
                if (runtime_exceeded(td, &td->tv_cache)) {
                        __update_tv_cache(td);
                        if (runtime_exceeded(td, &td->tv_cache)) {
-                               td->terminate = 1;
+                               fio_mark_td_terminate(td);
                                break;
                        }
                }
@@ -713,7 +714,7 @@ static uint64_t do_io(struct thread_data *td)
                if (runtime_exceeded(td, &td->tv_cache)) {
                        __update_tv_cache(td);
                        if (runtime_exceeded(td, &td->tv_cache)) {
-                               td->terminate = 1;
+                               fio_mark_td_terminate(td);
                                break;
                        }
                }
@@ -921,7 +922,7 @@ reap:
 
        if (td->o.fill_device && td->error == ENOSPC) {
                td->error = 0;
-               td->terminate = 1;
+               fio_mark_td_terminate(td);
        }
        if (!td->error) {
                struct fio_file *f;
@@ -1443,6 +1444,9 @@ static void *thread_main(void *data)
                        goto err;
        }
 
+       if (td->flags & TD_F_COMPRESS_LOG)
+               tp_init(&td->tp_data);
+
        fio_verify_init(td);
 
        fio_gettime(&td->epoch, NULL);
@@ -1524,6 +1528,9 @@ static void *thread_main(void *data)
 
        fio_writeout_logs(td);
 
+       if (td->flags & TD_F_COMPRESS_LOG)
+               tp_exit(&td->tp_data);
+
        if (o->exec_postrun)
                exec_string(o, o->exec_postrun, (const char *)"postrun");
 
@@ -1575,7 +1582,7 @@ static int fork_main(int shmid, int offset)
        struct thread_data *td;
        void *data, *ret;
 
-#ifndef __hpux
+#if !defined(__hpux) && !defined(CONFIG_NO_SHM)
        data = shmat(shmid, NULL, 0);
        if (data == (void *) -1) {
                int __err = errno;
@@ -1596,6 +1603,13 @@ static int fork_main(int shmid, int offset)
        return (int) (uintptr_t) ret;
 }
 
+static void dump_td_info(struct thread_data *td)
+{
+       log_err("fio: job '%s' hasn't exited in %lu seconds, it appears to "
+               "be stuck. Doing forceful exit of this job.\n", td->o.name,
+                       (unsigned long) time_since_now(&td->terminate_time));
+}
+
 /*
  * Run over the job map and reap the threads that have exited, if any.
  */
@@ -1673,6 +1687,17 @@ static void reap_threads(unsigned int *nr_running, unsigned int *t_rate,
                        }
                }
 
+               /*
+                * If the job is stuck, do a forceful timeout of it and
+                * move on.
+                */
+               if (td->terminate &&
+                   time_since_now(&td->terminate_time) >= FIO_REAP_TIMEOUT) {
+                       dump_td_info(td);
+                       td_set_runstate(td, TD_REAPED);
+                       goto reaped;
+               }
+
                /*
                 * thread is not dead, continue
                 */
@@ -2020,9 +2045,13 @@ int fio_backend(void)
                return 0;
 
        if (write_bw_log) {
-               setup_log(&agg_io_log[DDIR_READ], 0, IO_LOG_TYPE_BW);
-               setup_log(&agg_io_log[DDIR_WRITE], 0, IO_LOG_TYPE_BW);
-               setup_log(&agg_io_log[DDIR_TRIM], 0, IO_LOG_TYPE_BW);
+               struct log_params p = {
+                       .log_type = IO_LOG_TYPE_BW,
+               };
+
+               setup_log(&agg_io_log[DDIR_READ], &p, "agg-read_bw.log");
+               setup_log(&agg_io_log[DDIR_WRITE], &p, "agg-write_bw.log");
+               setup_log(&agg_io_log[DDIR_TRIM], &p, "agg-trim_bw.log");
        }
 
        startup_mutex = fio_mutex_init(FIO_MUTEX_LOCKED);
@@ -2039,13 +2068,16 @@ int fio_backend(void)
        run_threads();
 
        if (!fio_abort) {
-               show_run_stats();
+               __show_run_stats();
                if (write_bw_log) {
-                       __finish_log(agg_io_log[DDIR_READ], "agg-read_bw.log");
-                       __finish_log(agg_io_log[DDIR_WRITE],
-                                       "agg-write_bw.log");
-                       __finish_log(agg_io_log[DDIR_TRIM],
-                                       "agg-write_bw.log");
+                       int i;
+
+                       for (i = 0; i < DDIR_RWDIR_CNT; i++) {
+                               struct io_log *log = agg_io_log[i];
+
+                               flush_log(log);
+                               free_log(log);
+                       }
                }
        }