td->iolog_buf = NULL;
}
+static int64_t iolog_items_to_fetch(struct thread_data *td)
+{
+ struct timespec now;
+ uint64_t elapsed;
+ uint64_t for_1s;
+ int64_t items_to_fetch;
+
+ if (!td->io_log_highmark)
+ return 10;
+
+
+ fio_gettime(&now, NULL);
+ elapsed = ntime_since(&td->io_log_highmark_time, &now);
+ if (elapsed) {
+ for_1s = (td->io_log_highmark - td->io_log_current) * 1000000000 / elapsed;
+ items_to_fetch = for_1s - td->io_log_current;
+ if (items_to_fetch < 0)
+ items_to_fetch = 0;
+ } else
+ items_to_fetch = 0;
+
+ td->io_log_highmark = td->io_log_current + items_to_fetch;
+ td->io_log_checkmark = (td->io_log_highmark + 1) / 2;
+ fio_gettime(&td->io_log_highmark_time, NULL);
+
+ return items_to_fetch;
+}
+
/*
* Read version 2 iolog data. It is enhanced to include per-file logging,
* syncs, etc.
char *rfname, *fname, *act;
char *str, *p;
enum fio_ddir rw;
+ bool realloc = false;
int64_t items_to_fetch = 0;
if (td->o.read_iolog_chunked) {
- if (td->io_log_highmark == 0) {
- items_to_fetch = 10;
- } else {
- struct timespec now;
- uint64_t elapsed;
- uint64_t for_1s;
-
- fio_gettime(&now, NULL);
- elapsed = ntime_since(&td->io_log_highmark_time, &now);
- if (elapsed) {
- for_1s = (td->io_log_highmark - td->io_log_current) * 1000000000 / elapsed;
- items_to_fetch = for_1s - td->io_log_current;
- } else
- items_to_fetch = 0;
- if (items_to_fetch < 0)
- items_to_fetch = 0;
-
- td->io_log_highmark = td->io_log_current + items_to_fetch;
- td->io_log_checkmark = (td->io_log_highmark + 1) / 2;
- fio_gettime(&td->io_log_highmark_time, NULL);
-
- if (items_to_fetch == 0)
- return true;
- }
+ items_to_fetch = iolog_items_to_fetch(td);
+ if (!items_to_fetch)
+ return true;
}
+
/*
* Read in the read iolog and store it, reuse the infrastructure
* for doing verifications.
dprint(FD_FILE, "iolog: ignoring"
" re-add of file %s\n", fname);
} else {
- fileno = add_file(td, fname, 0, 1);
+ fileno = add_file(td, fname, td->subjob_number, 1);
file_action = FIO_LOG_ADD_FILE;
}
continue;
ipo_bytes_align(td->o.replay_align, ipo);
ipo->len = bytes;
- if (rw != DDIR_INVAL && bytes > td->o.max_bs[rw])
+ if (rw != DDIR_INVAL && bytes > td->o.max_bs[rw]) {
+ realloc = true;
td->o.max_bs[rw] = bytes;
+ }
ipo->fileno = fileno;
ipo->file_action = file_action;
td->o.size += bytes;
return false;
}
td->o.td_ddir = TD_DDIR_RW;
+ if (realloc && td->orig_buffer)
+ {
+ io_u_quiesce(td);
+ free_io_mem(td);
+ init_io_u_buffers(td);
+ }
return true;
}
char buffer[256], *p;
FILE *f = NULL;
bool ret;
- if (is_socket(td->o.read_iolog_file)) {
- int fd = open_socket(td->o.read_iolog_file);
+ char* fname = get_name_by_idx(td->o.read_iolog_file, td->subjob_number);
+ dprint(FD_IO, "iolog: name=%s\n", fname);
+
+ if (is_socket(fname)) {
+ int fd = open_socket(fname);
if (fd >= 0) {
f = fdopen(fd, "r");
}
} else
- f = fopen(td->o.read_iolog_file, "r");
+ f = fopen(fname, "r");
+ free(fname);
if (!f) {
perror("fopen read iolog");
return false;