crc/test: add fnv
[fio.git] / backend.c
index 68540abb9a2c1bd80c346d311f94646b464e2ff9..981625b61095dd42995d32291ec3fdc4b58cb597 100644 (file)
--- a/backend.c
+++ b/backend.c
@@ -391,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 {
                        /*
@@ -460,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;
                        }
                }
@@ -714,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;
                        }
                }
@@ -922,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;
@@ -1603,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.
  */
@@ -1680,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
                 */
@@ -2050,7 +2068,7 @@ int fio_backend(void)
        run_threads();
 
        if (!fio_abort) {
-               show_run_stats();
+               __show_run_stats();
                if (write_bw_log) {
                        int i;