return 0;
if (!td->o.timeout)
return 0;
- if (mtime_since(&td->epoch, t) >= td->o.timeout * 1000)
+ if (mtime_since(&td->epoch, t) >= td->o.timeout )
return 1;
return 0;
if (td->o.start_delay) {
spent = mtime_since_genesis();
- if (td->o.start_delay * 1000 > spent)
+ if (td->o.start_delay > spent)
continue;
}
perc = 1.0;
if (td->o.time_based) {
- perc_t = (double) elapsed / (double) td->o.timeout;
+ perc_t = (double) elapsed /
+ (double) (td->o.timeout / 1000);
if (perc_t < perc)
perc = perc_t;
}
eta_sec = (unsigned long) (elapsed * (1.0 / perc)) - elapsed;
if (td->o.timeout &&
- eta_sec > (td->o.timeout + done_secs - elapsed))
- eta_sec = td->o.timeout + done_secs - elapsed;
+ eta_sec > ( (td->o.timeout / 1000) + done_secs - elapsed))
+ eta_sec = (td->o.timeout / 1000) + done_secs
+ - elapsed;
} else if (td->runstate == TD_NOT_CREATED || td->runstate == TD_CREATED
|| td->runstate == TD_INITIALIZED
|| td->runstate == TD_SETTING_UP
* 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;
+ t_eta = (td->o.timeout + td->o.start_delay +
+ td->o.ramp_time ) / 1000;
if (in_ramp_time(td)) {
unsigned long ramp_left;
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 / 1000;
}
if (r_eta && t_eta)
SI integer: a whole number, possibly containing a suffix denoting the base unit
of the value. Accepted suffixes are `k', 'M', 'G', 'T', and 'P', denoting
kilo (1024), mega (1024^2), giga (1024^3), tera (1024^4), and peta (1024^5)
-respectively. The suffix is not case sensitive. If prefixed with '0x', the
-value is assumed to be base 16 (hexadecimal). A suffix may include a trailing 'b',
-for instance 'kb' is identical to 'k'. You can specify a base 10 value
-by using 'KiB', 'MiB', 'GiB', etc. This is useful for disk drives where
-values are often given in base 10 values. Specifying '30GiB' will get you
-30*1000^3 bytes.
+respectively. If prefixed with '0x', the value is assumed to be base 16
+(hexadecimal). A suffix may include a trailing 'b', for instance 'kb' is
+identical to 'k'. You can specify a base 10 value by using 'KiB', 'MiB','GiB',
+etc. This is useful for disk drives where values are often given in base 10
+values. Specifying '30GiB' will get you 30*1000^3 bytes.
+When specifying times the default suffix meaning changes, still denoting the
+base unit of the value, but accepted suffixes are 'D' (days), 'H' (hours), 'M'
+(minutes), 'S' Seconds, 'ms' milli seconds. Time values without a unit specify
+seconds.
+The suffixes are not case sensitive.
.TP
.I bool
Boolean: a true or false value. `0' denotes false, `1' denotes true.
show_option_values(o);
}
-static unsigned long get_mult_time(char c)
+static unsigned long long get_mult_time(const char *str, int len)
{
- switch (c) {
- case 'm':
- case 'M':
- return 60;
- case 'h':
- case 'H':
- return 60 * 60;
- case 'd':
- case 'D':
- return 24 * 60 * 60;
- default:
- return 1;
+ const char *p = str;
+ char *c;
+ unsigned long long mult = 1000;
+
+ /*
+ * Go forward until we hit a non-digit, or +/- sign
+ */
+ while ((p - str) <= len) {
+ if (!isdigit((int) *p) && (*p != '+') && (*p != '-'))
+ break;
+ p++;
}
+
+ if (!isalpha((int) *p))
+ return 1000;
+
+ c = strdup(p);
+ for (int i = 0; i < strlen(c); i++)
+ c[i] = tolower(c[i]);
+
+ if (!strncmp("ms", c, 2))
+ mult = 1;
+ else if (!strcmp("s", c))
+ mult = 1000;
+ else if (!strcmp("m", c))
+ mult = 60 * 1000;
+ else if (!strcmp("h", c))
+ mult = 60 * 60 * 1000;
+ else if (!strcmp("d", c))
+ mult = 24 * 60 * 60 * 1000;
+
+ free(c);
+ return mult;
}
static int is_separator(char c)
else
*val *= mult;
} else
- *val *= get_mult_time(str[len - 1]);
+ *val *= get_mult_time(str, len);
return 0;
}
return 1;
fio_gettime(&tv, NULL);
- if (mtime_since(&td->epoch, &tv) >= td->o.ramp_time * 1000) {
+ if (mtime_since(&td->epoch, &tv) >= td->o.ramp_time ) {
td->ramp_time_over = 1;
reset_all_stats(td);
td_set_runstate(td, TD_RAMP);