X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=backend.c;h=981625b61095dd42995d32291ec3fdc4b58cb597;hp=e32d84165273cb5c71fc520d4926b2afd1708a18;hb=86d59660ca54dd2e3e2457f3683198afc2b2701c;hpb=aee2ab6775d96609a4632703827c409a7f9abcca diff --git a/backend.c b/backend.c index e32d8416..981625b6 100644 --- a/backend.c +++ b/backend.c @@ -53,7 +53,7 @@ #include "lib/getrusage.h" #include "idletime.h" #include "err.h" -#include "tp.h" +#include "lib/tp.h" static pthread_t disk_util_thread; static struct fio_mutex *disk_thread_mutex; @@ -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;