projects
/
fio.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge branch 'master' of https://github.com/majianpeng/fio
[fio.git]
/
eta.c
diff --git
a/eta.c
b/eta.c
index baaa68151dff8c85d6b76c3f885e06a0c4ca102a..9111f5ec1e670bfc4177c12e24601795be291efb 100644
(file)
--- a/
eta.c
+++ b/
eta.c
@@
-2,14
+2,18
@@
* Status and ETA code
*/
#include <unistd.h>
* Status and ETA code
*/
#include <unistd.h>
-#include <fcntl.h>
#include <string.h>
#include <string.h>
+#ifdef CONFIG_VALGRIND_DEV
+#include <valgrind/drd.h>
+#else
+#define DRD_IGNORE_VAR(x) do { } while (0)
+#endif
#include "fio.h"
#include "lib/pow2.h"
static char __run_str[REAL_MAX_JOBS + 1];
#include "fio.h"
#include "lib/pow2.h"
static char __run_str[REAL_MAX_JOBS + 1];
-static char run_str[__THREAD_RUNSTR_SZ(REAL_MAX_JOBS)];
+static char run_str[__THREAD_RUNSTR_SZ(REAL_MAX_JOBS)
+ 1
];
static void update_condensed_str(char *rstr, char *run_str_condensed)
{
static void update_condensed_str(char *rstr, char *run_str_condensed)
{
@@
-145,7
+149,7
@@
void eta_to_str(char *str, unsigned long eta_sec)
str += sprintf(str, "%02uh:", h);
str += sprintf(str, "%02um:", m);
str += sprintf(str, "%02uh:", h);
str += sprintf(str, "%02um:", m);
- s
tr += s
printf(str, "%02us", s);
+ sprintf(str, "%02us", s);
}
/*
}
/*
@@
-347,6
+351,14
@@
static void calc_iops(int unified_rw_rep, unsigned long mtime,
}
}
}
}
+/*
+ * Allow a little slack - if we're within 95% of the time, allow ETA.
+ */
+bool eta_time_within_slack(unsigned int time)
+{
+ return time > ((eta_interval_msec * 95) / 100);
+}
+
/*
* Print status of the jobs we know about. This includes rate estimates,
* ETA, thread state, etc.
/*
* Print status of the jobs we know about. This includes rate estimates,
* ETA, thread state, etc.
@@
-489,10
+501,7
@@
bool calc_thread_status(struct jobs_eta *je, int force)
disp_time = mtime_since(&disp_prev_time, &now);
disp_time = mtime_since(&disp_prev_time, &now);
- /*
- * Allow a little slack, the target is to print it every 1000 msecs
- */
- if (!force && disp_time < 900)
+ if (!force && !eta_time_within_slack(disp_time))
return false;
calc_rate(unified_rw_rep, disp_time, io_bytes, disp_io_bytes, je->rate);
return false;
calc_rate(unified_rw_rep, disp_time, io_bytes, disp_io_bytes, je->rate);
@@
-515,7
+524,7
@@
void display_thread_status(struct jobs_eta *je)
static int eta_new_line_init, eta_new_line_pending;
static int linelen_last;
static int eta_good;
static int eta_new_line_init, eta_new_line_pending;
static int linelen_last;
static int eta_good;
- char output[
REAL_MAX_JOBS
+ 512], *p = output;
+ char output[
__THREAD_RUNSTR_SZ(REAL_MAX_JOBS)
+ 512], *p = output;
char eta_str[128];
double perc = 0.0;
char eta_str[128];
double perc = 0.0;
@@
-526,6
+535,7
@@
void display_thread_status(struct jobs_eta *je)
if (eta_new_line_pending) {
eta_new_line_pending = 0;
if (eta_new_line_pending) {
eta_new_line_pending = 0;
+ linelen_last = 0;
p += sprintf(p, "\n");
}
p += sprintf(p, "\n");
}
@@
-537,9
+547,9
@@
void display_thread_status(struct jobs_eta *je)
char *tr, *mr;
mr = num2str(je->m_rate[0] + je->m_rate[1] + je->m_rate[2],
char *tr, *mr;
mr = num2str(je->m_rate[0] + je->m_rate[1] + je->m_rate[2],
-
4
, 0, je->is_pow2, N2S_BYTEPERSEC);
+
je->sig_figs
, 0, je->is_pow2, N2S_BYTEPERSEC);
tr = num2str(je->t_rate[0] + je->t_rate[1] + je->t_rate[2],
tr = num2str(je->t_rate[0] + je->t_rate[1] + je->t_rate[2],
-
4
, 0, je->is_pow2, N2S_BYTEPERSEC);
+
je->sig_figs
, 0, je->is_pow2, N2S_BYTEPERSEC);
p += sprintf(p, ", %s-%s", mr, tr);
free(tr);
p += sprintf(p, ", %s-%s", mr, tr);
free(tr);
@@
-559,6
+569,7
@@
void display_thread_status(struct jobs_eta *je)
size_t left;
int l;
int ddir;
size_t left;
int l;
int ddir;
+ int linelen;
if ((!je->eta_sec && !eta_good) || je->nr_ramp == je->nr_running ||
je->eta_sec == -1)
if ((!je->eta_sec && !eta_good) || je->nr_ramp == je->nr_running ||
je->eta_sec == -1)
@@
-596,17
+607,21
@@
void display_thread_status(struct jobs_eta *je)
rate_str[DDIR_READ], rate_str[DDIR_WRITE],
iops_str[DDIR_READ], iops_str[DDIR_WRITE],
eta_str);
rate_str[DDIR_READ], rate_str[DDIR_WRITE],
iops_str[DDIR_READ], iops_str[DDIR_WRITE],
eta_str);
+ /* If truncation occurred adjust l so p is on the null */
+ if (l >= left)
+ l = left - 1;
p += l;
p += l;
- if (l >= 0 && l < linelen_last)
- p += sprintf(p, "%*s", linelen_last - l, "");
- linelen_last = l;
+ linelen = p - output;
+ if (l >= 0 && linelen < linelen_last)
+ p += sprintf(p, "%*s", linelen_last - linelen, "");
+ linelen_last = linelen;
for (ddir = 0; ddir < DDIR_RWDIR_CNT; ddir++) {
free(rate_str[ddir]);
free(iops_str[ddir]);
}
}
for (ddir = 0; ddir < DDIR_RWDIR_CNT; ddir++) {
free(rate_str[ddir]);
free(iops_str[ddir]);
}
}
-
p +=
sprintf(p, "\r");
+ sprintf(p, "\r");
printf("%s", output);
printf("%s", output);
@@
-657,6
+672,7
@@
void print_thread_status(void)
void print_status_init(int thr_number)
{
void print_status_init(int thr_number)
{
+ DRD_IGNORE_VAR(__run_str);
__run_str[thr_number] = 'P';
update_condensed_str(__run_str, run_str);
}
__run_str[thr_number] = 'P';
update_condensed_str(__run_str, run_str);
}