From b0f65863844b4de92d10fefaabde80ea5bc3e5cc Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Wed, 20 May 2009 11:52:15 +0200 Subject: [PATCH] pre_read fixes 1) Add a specific runstate for pre-read, so we can see that this is what the job is currently doing. 2) open/close files for pre-read Signed-off-by: Jens Axboe --- HOWTO | 1 + eta.c | 9 +++++++-- filesetup.c | 18 +++++++++++++++++- fio.h | 1 + 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/HOWTO b/HOWTO index 1390f386..e22f7454 100644 --- a/HOWTO +++ b/HOWTO @@ -931,6 +931,7 @@ Idle Run P Thread setup, but not started. C Thread created. I Thread initialized, waiting. + p Thread running pre-reading file(s). R Running, doing sequential reads. r Running, doing random reads. W Running, doing sequential writes. diff --git a/eta.c b/eta.c index 5a5188f1..1e61b7e9 100644 --- a/eta.c +++ b/eta.c @@ -44,6 +44,9 @@ static void check_str_update(struct thread_data *td) c = 'W'; } break; + case TD_PRE_READING: + c = 'p'; + break; case TD_VERIFYING: c = 'V'; break; @@ -145,7 +148,8 @@ static int thread_eta(struct thread_data *td) eta_sec = td->o.timeout + done_secs - elapsed; } else if (td->runstate == TD_NOT_CREATED || td->runstate == TD_CREATED || td->runstate == TD_INITIALIZED - || td->runstate == TD_RAMP) { + || td->runstate == TD_RAMP + || td->runstate == TD_PRE_READING) { int t_eta = 0, r_eta = 0; /* @@ -242,7 +246,8 @@ void print_thread_status(void) if (td->o.bw_avg_time < bw_avg_time) bw_avg_time = td->o.bw_avg_time; if (td->runstate == TD_RUNNING || td->runstate == TD_VERIFYING - || td->runstate == TD_FSYNCING) { + || td->runstate == TD_FSYNCING + || td->runstate == TD_PRE_READING) { nr_running++; t_rate += td->o.rate; m_rate += td->o.ratemin; diff --git a/filesetup.c b/filesetup.c index 28580188..9fd04daa 100644 --- a/filesetup.c +++ b/filesetup.c @@ -121,11 +121,22 @@ err: static int pre_read_file(struct thread_data *td, struct fio_file *f) { - int r; + int r, did_open = 0, old_runstate; unsigned long long left; unsigned int bs; char *b; + if (!(f->flags & FIO_FILE_OPEN)) { + if (td->io_ops->open_file(td, f)) { + log_err("fio: cannot pre-read, failed to open file\n"); + return 1; + } + did_open = 1; + } + + old_runstate = td->runstate; + td_set_runstate(td, TD_PRE_READING); + bs = td->o.max_bs[DDIR_READ]; b = malloc(bs); memset(b, 0, bs); @@ -143,11 +154,16 @@ static int pre_read_file(struct thread_data *td, struct fio_file *f) left -= bs; continue; } else { + printf("r=%d\n", r); td_verror(td, EIO, "pre_read"); break; } } + td_set_runstate(td, old_runstate); + + if (did_open) + td->io_ops->close_file(td, f); free(b); return 0; } diff --git a/fio.h b/fio.h index cb80a111..b1360dd3 100644 --- a/fio.h +++ b/fio.h @@ -919,6 +919,7 @@ enum { TD_INITIALIZED, TD_RAMP, TD_RUNNING, + TD_PRE_READING, TD_VERIFYING, TD_FSYNCING, TD_EXITED, -- 2.25.1