projects
/
fio.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Add option for io_limit
[fio.git]
/
eta.c
diff --git
a/eta.c
b/eta.c
index 769ac14370429e07babd4c01fb30027d9c1638e9..7500082f4e2398da125b8a1a01cc7e981a021222 100644
(file)
--- a/
eta.c
+++ b/
eta.c
@@
-74,6
+74,9
@@
static void check_str_update(struct thread_data *td)
case TD_FSYNCING:
c = 'F';
break;
case TD_FSYNCING:
c = 'F';
break;
+ case TD_FINISHING:
+ c = 'f';
+ break;
case TD_CREATED:
c = 'C';
break;
case TD_CREATED:
c = 'C';
break;
@@
-127,8
+130,10
@@
static int thread_eta(struct thread_data *td)
unsigned long long bytes_total, bytes_done;
unsigned long eta_sec = 0;
unsigned long elapsed;
unsigned long long bytes_total, bytes_done;
unsigned long eta_sec = 0;
unsigned long elapsed;
+ uint64_t timeout;
elapsed = (mtime_since_now(&td->epoch) + 999) / 1000;
elapsed = (mtime_since_now(&td->epoch) + 999) / 1000;
+ timeout = td->o.timeout / 1000000UL;
bytes_total = td->total_io_size;
bytes_total = td->total_io_size;
@@
-169,23
+174,36
@@
static int thread_eta(struct thread_data *td)
double perc, perc_t;
bytes_done = ddir_rw_sum(td->io_bytes);
double perc, perc_t;
bytes_done = ddir_rw_sum(td->io_bytes);
- perc = (double) bytes_done / (double) bytes_total;
- if (perc > 1.0)
- perc = 1.0;
+
+ if (bytes_total) {
+ perc = (double) bytes_done / (double) bytes_total;
+ if (perc > 1.0)
+ perc = 1.0;
+ } else
+ perc = 0.0;
if (td->o.time_based) {
if (td->o.time_based) {
- perc_t = (double) elapsed / (double) td->o.timeout;
- if (perc_t < perc)
- perc = perc_t;
+ if (timeout) {
+ perc_t = (double) elapsed / (double) timeout;
+ if (perc_t < perc)
+ perc = perc_t;
+ } else {
+ /*
+ * Will never hit, we can't have time_based
+ * without a timeout set.
+ */
+ perc = 0.0;
+ }
}
eta_sec = (unsigned long) (elapsed * (1.0 / perc)) - elapsed;
if (td->o.timeout &&
}
eta_sec = (unsigned long) (elapsed * (1.0 / perc)) - elapsed;
if (td->o.timeout &&
- eta_sec > (t
d->o.t
imeout + done_secs - elapsed))
- eta_sec = t
d->o.t
imeout + done_secs - elapsed;
+ eta_sec > (timeout + done_secs - elapsed))
+ eta_sec = timeout + done_secs - elapsed;
} else if (td->runstate == TD_NOT_CREATED || td->runstate == TD_CREATED
|| td->runstate == TD_INITIALIZED
} else if (td->runstate == TD_NOT_CREATED || td->runstate == TD_CREATED
|| td->runstate == TD_INITIALIZED
+ || td->runstate == TD_SETTING_UP
|| td->runstate == TD_RAMP
|| td->runstate == TD_PRE_READING) {
int t_eta = 0, r_eta = 0;
|| td->runstate == TD_RAMP
|| td->runstate == TD_PRE_READING) {
int t_eta = 0, r_eta = 0;
@@
-196,8
+214,12
@@
static int thread_eta(struct thread_data *td)
* if given, otherwise assume it'll run at the specified rate.
*/
if (td->o.timeout) {
* if given, otherwise assume it'll run at the specified rate.
*/
if (td->o.timeout) {
- t_eta = td->o.timeout + td->o.start_delay +
- td->o.ramp_time;
+ uint64_t timeout = td->o.timeout;
+ uint64_t start_delay = td->o.start_delay;
+ uint64_t ramp_time = td->o.ramp_time;
+
+ t_eta = timeout + start_delay + ramp_time;
+ t_eta /= 1000000ULL;
if (in_ramp_time(td)) {
unsigned long ramp_left;
if (in_ramp_time(td)) {
unsigned long ramp_left;
@@
-211,7
+233,7
@@
static int thread_eta(struct thread_data *td)
rate_bytes = ddir_rw_sum(td->o.rate);
if (rate_bytes) {
r_eta = (bytes_total / 1024) / rate_bytes;
rate_bytes = ddir_rw_sum(td->o.rate);
if (rate_bytes) {
r_eta = (bytes_total / 1024) / rate_bytes;
- r_eta +=
td->o.start_delay
;
+ r_eta +=
(td->o.start_delay / 1000000ULL)
;
}
if (r_eta && t_eta)
}
if (r_eta && t_eta)
@@
-324,7
+346,8
@@
int calc_thread_status(struct jobs_eta *je, int force)
bw_avg_time = td->o.bw_avg_time;
if (td->runstate == TD_RUNNING || td->runstate == TD_VERIFYING
|| td->runstate == TD_FSYNCING
bw_avg_time = td->o.bw_avg_time;
if (td->runstate == TD_RUNNING || td->runstate == TD_VERIFYING
|| td->runstate == TD_FSYNCING
- || td->runstate == TD_PRE_READING) {
+ || td->runstate == TD_PRE_READING
+ || td->runstate == TD_FINISHING) {
je->nr_running++;
if (td_read(td)) {
je->t_rate[0] += td->o.rate[DDIR_READ];
je->nr_running++;
if (td_read(td)) {
je->t_rate[0] += td->o.rate[DDIR_READ];
@@
-349,9
+372,10
@@
int calc_thread_status(struct jobs_eta *je, int force)
} else if (td->runstate == TD_RAMP) {
je->nr_running++;
je->nr_ramp++;
} else if (td->runstate == TD_RAMP) {
je->nr_running++;
je->nr_ramp++;
- } else if (td->runstate == TD_SETTING_UP)
+ } else if (td->runstate == TD_SETTING_UP)
{
je->nr_running++;
je->nr_running++;
- else if (td->runstate < TD_RUNNING)
+ je->nr_setting_up++;
+ } else if (td->runstate < TD_RUNNING)
je->nr_pending++;
if (je->elapsed_sec >= 3)
je->nr_pending++;
if (je->elapsed_sec >= 3)
@@
-361,7
+385,7
@@
int calc_thread_status(struct jobs_eta *je, int force)
check_str_update(td);
check_str_update(td);
- if (td->runstate > TD_
RAM
P) {
+ if (td->runstate > TD_
SETTING_U
P) {
int ddir;
for (ddir = DDIR_READ; ddir < DDIR_RWDIR_CNT; ddir++) {
int ddir;
for (ddir = DDIR_READ; ddir < DDIR_RWDIR_CNT; ddir++) {
@@
-471,8
+495,13
@@
void display_thread_status(struct jobs_eta *je)
if ((!je->eta_sec && !eta_good) || je->nr_ramp == je->nr_running)
strcpy(perc_str, "-.-% done");
else {
if ((!je->eta_sec && !eta_good) || je->nr_ramp == je->nr_running)
strcpy(perc_str, "-.-% done");
else {
+ double mult = 100.0;
+
+ if (je->nr_setting_up && je->nr_running)
+ mult *= (1.0 - (double) je->nr_setting_up / (double) je->nr_running);
+
eta_good = 1;
eta_good = 1;
- perc *=
100.0
;
+ perc *=
mult
;
sprintf(perc_str, "%3.1f%% done", perc);
}
sprintf(perc_str, "%3.1f%% done", perc);
}