X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=backend.c;h=30f78b72f9d15acdca6c04930a8e26db53fa2d5e;hb=908119302fbb900a449988d03dacc95426c09e08;hp=ee75566af84cd6f07a8a4e824ba79e9788667d1b;hpb=c89318761586dbd77b8f31ce0ed68ff4fc086c89;p=fio.git diff --git a/backend.c b/backend.c index ee75566a..30f78b72 100644 --- 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"); @@ -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); @@ -2041,11 +2070,14 @@ int fio_backend(void) if (!fio_abort) { 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); + } } }