projects
/
fio.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Add option to disable fadvise() hints
[fio.git]
/
log.c
diff --git
a/log.c
b/log.c
index 8d313ec65419ef926f560d762d88eb4996341379..dbca3ccb7f023f37df7d4a9a52aa291cfd45a7a7 100644
(file)
--- a/
log.c
+++ b/
log.c
@@
-5,7
+5,7
@@
void write_iolog_put(struct thread_data *td, struct io_u *io_u)
{
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,%l
u\n", io_u->ddir, io_u->offset, io_u->buflen);
}
int read_iolog_get(struct thread_data *td, struct io_u *io_u)
}
int read_iolog_get(struct thread_data *td, struct io_u *io_u)
@@
-18,6
+18,7
@@
int read_iolog_get(struct thread_data *td, struct io_u *io_u)
io_u->offset = ipo->offset;
io_u->buflen = ipo->len;
io_u->ddir = ipo->ddir;
io_u->offset = ipo->offset;
io_u->buflen = ipo->len;
io_u->ddir = ipo->ddir;
+ io_u->file = ipo->file;
free(ipo);
return 0;
}
free(ipo);
return 0;
}
@@
-38,7
+39,7
@@
void prune_io_piece_log(struct thread_data *td)
}
/*
}
/*
- * log a succesful write, so we can unwind the log for verify
+ * log a succes
s
ful write, so we can unwind the log for verify
*/
void log_io_piece(struct thread_data *td, struct io_u *io_u)
{
*/
void log_io_piece(struct thread_data *td, struct io_u *io_u)
{
@@
-46,6
+47,7
@@
void log_io_piece(struct thread_data *td, struct io_u *io_u)
struct list_head *entry;
INIT_LIST_HEAD(&ipo->list);
struct list_head *entry;
INIT_LIST_HEAD(&ipo->list);
+ ipo->file = io_u->file;
ipo->offset = io_u->offset;
ipo->len = io_u->buflen;
ipo->offset = io_u->offset;
ipo->len = io_u->buflen;
@@
-54,7
+56,7
@@
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
*/
* 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;
}
list_add_tail(&ipo->list, &td->io_hist_list);
return;
}
@@
-80,49
+82,34
@@
void write_iolog_close(struct thread_data *td)
free(td->iolog_buf);
}
free(td->iolog_buf);
}
-int init_iolog(struct thread_data *td)
+/*
+ * Open a stored log and read in the entries.
+ */
+static int init_iolog_read(struct thread_data *td)
{
unsigned long long offset;
unsigned int bytes;
char *str, *p;
FILE *f;
{
unsigned long long offset;
unsigned int bytes;
char *str, *p;
FILE *f;
- int rw, i, reads, writes;
-
- if (!td->read_iolog && !td->write_iolog)
- return 0;
-
- if (td->read_iolog)
- f = fopen(td->iolog_file, "r");
- else
- f = fopen(td->iolog_file, "w");
+ int rw, reads, writes;
+ f = fopen(td->o.read_iolog_file, "r");
if (!f) {
if (!f) {
- perror("fopen iolog");
- printf("file %s, %d/%d\n", td->iolog_file, td->read_iolog, td->write_iolog);
+ perror("fopen read iolog");
return 1;
}
return 1;
}
- /*
- * That's it for writing, setup a log buffer and we're done.
- */
- if (td->write_iolog) {
- td->iolog_f = f;
- td->iolog_buf = malloc(8192);
- setvbuf(f, td->iolog_buf, _IOFBF, 8192);
- return 0;
- }
-
/*
* Read in the read iolog and store it, reuse the infrastructure
* for doing verifications.
*/
str = malloc(4096);
/*
* Read in the read iolog and store it, reuse the infrastructure
* for doing verifications.
*/
str = malloc(4096);
- reads = writes =
i =
0;
+ reads = writes = 0;
while ((p = fgets(str, 4096, f)) != NULL) {
struct io_piece *ipo;
if (sscanf(p, "%d,%llu,%u", &rw, &offset, &bytes) != 3) {
while ((p = fgets(str, 4096, f)) != NULL) {
struct io_piece *ipo;
if (sscanf(p, "%d,%llu,%u", &rw, &offset, &bytes) != 3) {
-
fprintf(stderr,
"bad iolog: %s\n", p);
+
log_err(
"bad iolog: %s\n", p);
continue;
}
if (rw == DDIR_READ)
continue;
}
if (rw == DDIR_READ)
@@
-130,7
+117,7
@@
int init_iolog(struct thread_data *td)
else if (rw == DDIR_WRITE)
writes++;
else {
else if (rw == DDIR_WRITE)
writes++;
else {
-
fprintf(stderr,
"bad ddir: %d\n", rw);
+
log_err(
"bad ddir: %d\n", rw);
continue;
}
continue;
}
@@
-138,47
+125,64
@@
int init_iolog(struct thread_data *td)
INIT_LIST_HEAD(&ipo->list);
ipo->offset = offset;
ipo->len = bytes;
INIT_LIST_HEAD(&ipo->list);
ipo->offset = offset;
ipo->len = bytes;
- i
f (bytes > td->max_bs)
- td->max_bs = bytes;
-
ipo->ddir = rw
;
+ i
po->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);
list_add_tail(&ipo->list, &td->io_log_list);
- i++;
}
free(str);
fclose(f);
}
free(str);
fclose(f);
- if (!
i
)
+ if (!
reads && !writes
)
return 1;
return 1;
-
- if (reads && !writes)
- td->ddir = DDIR_READ;
+ else if (reads && !writes)
+ td->o.td_ddir = TD_DDIR_READ;
else if (!reads && writes)
else if (!reads && writes)
- td->
ddir =
DDIR_READ;
+ td->
o.td_ddir = TD_
DDIR_READ;
else
else
- td->
iomix = 1
;
+ td->
o.td_ddir = TD_DDIR_RW
;
return 0;
}
return 0;
}
-int setup_rate(struct thread_data *td)
+/*
+ * Setup a log for storing io patterns.
+ */
+static int init_iolog_write(struct thread_data *td)
{
{
- int nr_reads_per_sec;
-
- if (!td->rate)
- return 0;
+ FILE *f;
- if (td->rate < td->ratemin) {
- fprintf(stderr, "min rate larger than nominal rate\n");
- return -1;
+ f = fopen(td->o.write_iolog_file, "w+");
+ if (!f) {
+ perror("fopen write iolog");
+ return 1;
}
}
- nr_reads_per_sec = (td->rate * 1024) / td->min_bs;
- td->rate_usec_cycle = 1000000 / nr_reads_per_sec;
- td->rate_pending_usleep = 0;
+ /*
+ * That's it for writing, setup a log buffer and we're done.
+ */
+ td->iolog_f = f;
+ td->iolog_buf = malloc(8192);
+ setvbuf(f, td->iolog_buf, _IOFBF, 8192);
return 0;
}
return 0;
}
+int init_iolog(struct thread_data *td)
+{
+ int ret = 0;
+
+ if (td->io_ops->flags & FIO_DISKLESSIO)
+ return 0;
+
+ if (td->o.read_iolog_file)
+ ret = init_iolog_read(td);
+ else if (td->o.write_iolog_file)
+ ret = init_iolog_write(td);
+
+ return ret;
+}
+
void setup_log(struct io_log **log)
{
struct io_log *l = malloc(sizeof(*l));
void setup_log(struct io_log **log)
{
struct io_log *l = malloc(sizeof(*l));
@@
-189,14
+193,12
@@
void setup_log(struct io_log **log)
*log = l;
}
*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;
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;
if (!f) {
perror("fopen log");
return;
@@
-209,3
+211,11
@@
void finish_log(struct thread_data *td, struct io_log *log, const char *name)
free(log->log);
free(log);
}
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);
+}