void write_iolog_put(struct thread_data *td, struct io_u *io_u)
{
- fprintf(td->iolog_f, "%d,%llu,%u\n", io_u->ddir, io_u->offset, io_u->buflen);
+ fprintf(td->iolog_f, "%u,%llu,%lu\n", io_u->ddir, io_u->offset, io_u->buflen);
}
int read_iolog_get(struct thread_data *td, struct io_u *io_u)
}
/*
- * log a succesful write, so we can unwind the log for verify
+ * log a successful write, so we can unwind the log for verify
*/
void log_io_piece(struct thread_data *td, struct io_u *io_u)
{
* be laid out with the block scattered as written. it's faster to
* read them in in that order again, so don't sort
*/
- if (td->sequential || !td->overwrite) {
+ if (!td_random(td) || !td->o.overwrite) {
list_add_tail(&ipo->list, &td->io_hist_list);
return;
}
FILE *f;
int rw, reads, writes;
- f = fopen(td->iolog_file, "r");
+ f = fopen(td->o.read_iolog_file, "r");
if (!f) {
perror("fopen read iolog");
return 1;
INIT_LIST_HEAD(&ipo->list);
ipo->offset = offset;
ipo->len = bytes;
- if (bytes > td->max_bs)
- td->max_bs = bytes;
- ipo->ddir = rw;
+ ipo->ddir = (enum fio_ddir) rw;
+ if (bytes > td->o.max_bs[rw])
+ td->o.max_bs[rw] = bytes;
list_add_tail(&ipo->list, &td->io_log_list);
}
if (!reads && !writes)
return 1;
else if (reads && !writes)
- td->ddir = DDIR_READ;
+ td->o.td_ddir = TD_DDIR_READ;
else if (!reads && writes)
- td->ddir = DDIR_READ;
+ td->o.td_ddir = TD_DDIR_READ;
else
- td->iomix = 1;
+ td->o.td_ddir = TD_DDIR_RW;
return 0;
}
*/
static int init_iolog_write(struct thread_data *td)
{
- FILE *f = fopen(td->iolog_file, "w");
+ FILE *f;
- f = fopen(td->iolog_file, "w");
+ f = fopen(td->o.write_iolog_file, "w+");
if (!f) {
perror("fopen write iolog");
return 1;
int init_iolog(struct thread_data *td)
{
- if (td->read_iolog)
- return init_iolog_read(td);
- else if (td->write_iolog)
- return init_iolog_write(td);
-
- return 0;
-}
-
-int setup_rate(struct thread_data *td)
-{
- int nr_reads_per_sec;
+ int ret = 0;
- if (!td->rate)
+ if (td->io_ops->flags & FIO_DISKLESSIO)
return 0;
- if (td->rate < td->ratemin) {
- log_err("min rate larger than nominal rate\n");
- return -1;
- }
+ if (td->o.read_iolog_file)
+ ret = init_iolog_read(td);
+ else if (td->o.write_iolog_file)
+ ret = init_iolog_write(td);
- nr_reads_per_sec = (td->rate * 1024) / td->min_bs;
- td->rate_usec_cycle = 1000000 / nr_reads_per_sec;
- td->rate_pending_usleep = 0;
- return 0;
+ return ret;
}
void setup_log(struct io_log **log)
*log = l;
}
-void finish_log(struct thread_data *td, struct io_log *log, const char *name)
+void __finish_log(struct io_log *log, const char *name)
{
- char file_name[256];
- FILE *f;
unsigned int i;
+ FILE *f;
- snprintf(file_name, 200, "client%d_%s.log", td->thread_number, name);
- f = fopen(file_name, "w");
+ f = fopen(name, "w");
if (!f) {
perror("fopen log");
return;
free(log->log);
free(log);
}
+
+void finish_log(struct thread_data *td, struct io_log *log, const char *name)
+{
+ char file_name[256];
+
+ snprintf(file_name, 200, "client%d_%s.log", td->thread_number, name);
+ __finish_log(log, file_name);
+}