projects
/
fio.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Improve dedupe/compression buffer filling for mixed block sizes
[fio.git]
/
backend.c
diff --git
a/backend.c
b/backend.c
index e32d84165273cb5c71fc520d4926b2afd1708a18..981625b61095dd42995d32291ec3fdc4b58cb597 100644
(file)
--- a/
backend.c
+++ b/
backend.c
@@
-53,7
+53,7
@@
#include "lib/getrusage.h"
#include "idletime.h"
#include "err.h"
#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;
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);
* fill_device option is set.
*/
td_clear_error(td);
-
td->terminate = 1
;
+
fio_mark_td_terminate(td)
;
return 1;
} else {
/*
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)) {
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;
}
}
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)) {
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;
}
}
break;
}
}
@@
-922,7
+922,7
@@
reap:
if (td->o.fill_device && td->error == ENOSPC) {
td->error = 0;
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;
}
if (!td->error) {
struct fio_file *f;
@@
-1603,6
+1603,13
@@
static int fork_main(int shmid, int offset)
return (int) (uintptr_t) ret;
}
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.
*/
/*
* 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
*/
/*
* thread is not dead, continue
*/
@@
-2050,7
+2068,7
@@
int fio_backend(void)
run_threads();
if (!fio_abort) {
run_threads();
if (!fio_abort) {
- show_run_stats();
+
__
show_run_stats();
if (write_bw_log) {
int i;
if (write_bw_log) {
int i;