projects
/
fio.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Allow verification of random overwrites w/ba < bs
[fio.git]
/
iolog.c
diff --git
a/iolog.c
b/iolog.c
index 4a7d939af251c77ae2de82d2ad57b15a9f04d4b4..b867583a27bc1f11e649ab8d88936507affcee53 100644
(file)
--- a/
iolog.c
+++ b/
iolog.c
@@
-60,14
+60,22
@@
void log_file(struct thread_data *td, struct fio_file *f,
static void iolog_delay(struct thread_data *td, unsigned long delay)
{
static void iolog_delay(struct thread_data *td, unsigned long delay)
{
- unsigned long usec = utime_since_now(&td->last_issue);
- unsigned long this_delay;
+ uint64_t usec = utime_since_now(&td->last_issue);
+ uint64_t this_delay;
+ struct timeval tv;
+ if (delay < td->time_offset) {
+ td->time_offset = 0;
+ return;
+ }
+
+ delay -= td->time_offset;
if (delay < usec)
return;
delay -= usec;
if (delay < usec)
return;
delay -= usec;
+ fio_gettime(&tv, NULL);
while (delay && !td->terminate) {
this_delay = delay;
if (this_delay > 500000)
while (delay && !td->terminate) {
this_delay = delay;
if (this_delay > 500000)
@@
-76,6
+84,12
@@
static void iolog_delay(struct thread_data *td, unsigned long delay)
usec_sleep(td, this_delay);
delay -= this_delay;
}
usec_sleep(td, this_delay);
delay -= this_delay;
}
+
+ usec = utime_since_now(&tv);
+ if (usec > delay)
+ td->time_offset = usec - delay;
+ else
+ td->time_offset = 0;
}
static int ipo_special(struct thread_data *td, struct io_piece *ipo)
}
static int ipo_special(struct thread_data *td, struct io_piece *ipo)
@@
-173,7
+187,7
@@
void prune_io_piece_log(struct thread_data *td)
}
while (!flist_empty(&td->io_hist_list)) {
}
while (!flist_empty(&td->io_hist_list)) {
- ipo = flist_entry(&td->io_hist_list, struct io_piece, list);
+ ipo = flist_
first_
entry(&td->io_hist_list, struct io_piece, list);
flist_del(&ipo->list);
remove_trim_entry(td, ipo);
td->io_hist_len--;
flist_del(&ipo->list);
remove_trim_entry(td, ipo);
td->io_hist_len--;
@@
-236,6
+250,7
@@
restart:
p = &td->io_hist_tree.rb_node;
parent = NULL;
while (*p) {
p = &td->io_hist_tree.rb_node;
parent = NULL;
while (*p) {
+ int overlap = 0;
parent = *p;
__ipo = rb_entry(parent, struct io_piece, rb_node);
parent = *p;
__ipo = rb_entry(parent, struct io_piece, rb_node);
@@
-243,11
+258,18
@@
restart:
p = &(*p)->rb_left;
else if (ipo->file > __ipo->file)
p = &(*p)->rb_right;
p = &(*p)->rb_left;
else if (ipo->file > __ipo->file)
p = &(*p)->rb_right;
- else if (ipo->offset < __ipo->offset)
+ else if (ipo->offset < __ipo->offset)
{
p = &(*p)->rb_left;
p = &(*p)->rb_left;
- else if (ipo->offset > __ipo->offset)
+ overlap = ipo->offset + ipo->len > __ipo->offset;
+ }
+ else if (ipo->offset > __ipo->offset) {
p = &(*p)->rb_right;
p = &(*p)->rb_right;
- else {
+ overlap = __ipo->offset + __ipo->len > ipo->offset;
+ }
+ else
+ overlap = 1;
+
+ if (overlap) {
dprint(FD_IO, "iolog: overlap %llu/%lu, %llu/%lu",
__ipo->offset, __ipo->len,
ipo->offset, ipo->len);
dprint(FD_IO, "iolog: overlap %llu/%lu, %llu/%lu",
__ipo->offset, __ipo->len,
ipo->offset, ipo->len);
@@
-871,18
+893,18
@@
int iolog_file_inflate(const char *file)
*/
total = ic.len;
do {
*/
total = ic.len;
do {
- size_t ret;
+ size_t
i
ret;
- ret = inflate_chunk(&ic, 1, stdout, &stream, &iter);
- total -= ret;
+
i
ret = inflate_chunk(&ic, 1, stdout, &stream, &iter);
+ total -=
i
ret;
if (!total)
break;
if (iter.err)
break;
ic.seq++;
if (!total)
break;
if (iter.err)
break;
ic.seq++;
- ic.len -= ret;
- ic.buf += ret;
+ ic.len -=
i
ret;
+ ic.buf +=
i
ret;
} while (1);
if (iter.seq) {
} while (1);
if (iter.seq) {