{
struct io_piece *ipo;
unsigned long elapsed;
-
+
while (!flist_empty(&td->io_log_list)) {
int ret;
elapsed = mtime_since_genesis();
if (ipo->delay > elapsed)
usec_sleep(td, (ipo->delay - elapsed) * 1000);
-
}
free(ipo);
-
+
if (io_u->ddir != DDIR_WAIT)
return 0;
}
}
}
-static void dump_ipo(struct io_piece *ipo, const char *msg)
-{
- printf("%s\n", msg);
- printf("\toffset %llu, len %lu, fl %x, ddir %d\n", ipo->offset, ipo->len, ipo->flags, ipo->ddir);
-}
-
/*
* log a successful write, so we can unwind the log for verify
*/
else if (ipo->offset > __ipo->offset)
p = &(*p)->rb_right;
else {
- if (ipo->len != __ipo->len) {
- log_err("fio: unexpected ipo overlap!\n");
- log_err("fio: please report this issue.\n");
- dump_ipo(ipo, "ipo");
- dump_ipo(__ipo, "__ipo");
- }
+ dprint(FD_IO, "iolog: overlap %llu/%lu, %llu/%lu",
+ __ipo->offset, __ipo->len,
+ ipo->offset, ipo->len);
td->io_hist_len--;
rb_erase(parent, &td->io_hist_tree);
remove_trim_entry(td, __ipo);
act);
continue;
}
+ fileno = get_fileno(td, fname);
} else if (r == 2) {
rw = DDIR_INVAL;
if (!strcmp(act, "add")) {
ipo->fileno = fileno;
ipo->file_action = file_action;
}
-
+
queue_io_piece(td, ipo);
}
return ret;
}
-void setup_log(struct io_log **log, unsigned long avg_msec)
+void setup_log(struct io_log **log, unsigned long avg_msec, int log_type)
{
struct io_log *l = malloc(sizeof(*l));
memset(l, 0, sizeof(*l));
l->nr_samples = 0;
l->max_samples = 1024;
+ l->log_type = log_type;
l->log = malloc(l->max_samples * sizeof(struct io_sample));
l->avg_msec = avg_msec;
*log = l;
}
for (i = 0; i < log->nr_samples; i++) {
- fprintf(f, "%lu, %lu, %u, %u\n", log->log[i].time,
- log->log[i].val,
- log->log[i].ddir,
- log->log[i].bs);
+ fprintf(f, "%lu, %lu, %u, %u\n",
+ (unsigned long) log->log[i].time,
+ (unsigned long) log->log[i].val,
+ log->log[i].ddir, log->log[i].bs);
}
fclose(f);
{
char file_name[256], *p;
- snprintf(file_name, 200, "%s_%s.log", prefix, postfix);
+ snprintf(file_name, sizeof(file_name), "%s_%s.log", prefix, postfix);
p = basename(file_name);
- __finish_log(log, p);
+
+ if (td->client_type == FIO_CLIENT_TYPE_GUI) {
+ fio_send_iolog(td, log, p);
+ free(log->log);
+ free(log);
+ } else
+ __finish_log(log, p);
}
void finish_log(struct thread_data *td, struct io_log *log, const char *name)