if (td_random(td) && (td->o.ddir_nr && !--td->ddir_nr)) {
td->ddir_nr = td->o.ddir_nr;
- if (get_next_rand_offset(td, f, ddir, &b))
+ if (get_next_rand_offset(td, f, ddir, &b)) {
+ dprint(FD_IO, "%s: getting rand offset failed\n",
+ f->file_name);
return 1;
+ }
} else {
if (f->last_pos >= f->real_file_size) {
if (!td_random(td) ||
- get_next_rand_offset(td, f, ddir, &b))
+ get_next_rand_offset(td, f, ddir, &b)) {
+ dprint(FD_IO, "%s: pos %llu > size %llu\n",
+ f->file_name, f->last_pos,
+ f->real_file_size);
return 1;
+ }
} else
b = (f->last_pos - f->file_offset) / td->o.min_bs[ddir];
}
do {
long r = os_random_long(&td->next_file_state);
+ int opened = 0;
fno = (unsigned int) ((double) td->o.nr_files
* (r / (OS_RAND_MAX + 1.0)));
if (f->flags & FIO_FILE_DONE)
continue;
+ if (!(f->flags & FIO_FILE_OPEN)) {
+ int err;
+
+ err = td_io_open_file(td, f);
+ if (err)
+ continue;
+ opened = 1;
+ }
+
if ((!goodf || (f->flags & goodf)) && !(f->flags & badf)) {
dprint(FD_FILE, "get_next_file_rand: %p\n", f);
return f;
}
+ if (opened)
+ td_io_close_file(td, f);
} while (1);
}
struct fio_file *f;
do {
+ int opened = 0;
+
f = td->files[td->next_file];
td->next_file++;
if (td->next_file >= td->o.nr_files)
td->next_file = 0;
+ dprint(FD_FILE, "trying file %s %x\n", f->file_name, f->flags);
if (f->flags & FIO_FILE_DONE) {
f = NULL;
continue;
}
+ if (!(f->flags & FIO_FILE_OPEN)) {
+ int err;
+
+ err = td_io_open_file(td, f);
+ if (err)
+ continue;
+ opened = 1;
+ }
+
if ((!goodf || (f->flags & goodf)) && !(f->flags & badf))
break;
+ if (opened)
+ td_io_close_file(td, f);
+
f = NULL;
} while (td->next_file != old_next_file);
}
f = td->file_service_file;
- if (f && (f->flags & FIO_FILE_OPEN) && td->file_service_left--)
- goto out;
+ if (f && (f->flags & FIO_FILE_OPEN) && !(f->flags & FIO_FILE_CLOSING)) {
+ if (td->o.file_service_type == FIO_FSERVICE_SEQ)
+ goto out;
+ if (td->file_service_left--)
+ goto out;
+ }
- if (td->o.file_service_type == FIO_FSERVICE_RR)
+ if (td->o.file_service_type == FIO_FSERVICE_RR ||
+ td->o.file_service_type == FIO_FSERVICE_SEQ)
f = get_next_file_rr(td, FIO_FILE_OPEN, FIO_FILE_CLOSING);
else
f = get_next_file_rand(td, FIO_FILE_OPEN, FIO_FILE_CLOSING);
td->file_service_file = f;
td->file_service_left = td->file_service_nr - 1;
out:
- dprint(FD_FILE, "get_next_file: %p\n", f);
+ dprint(FD_FILE, "get_next_file: %p [%s]\n", f, f->file_name);
return f;
}
td_io_close_file(td, f);
f->flags |= FIO_FILE_DONE;
td->nr_done_files++;
+ dprint(FD_FILE, "%s: is done (%d of %d)\n", f->file_name, td->nr_done_files, td->o.nr_files);
/*
* probably not the right place to do this, but see
if (td->nr_open_files < td->o.open_files &&
td->o.open_files != td->o.nr_files) {
f = find_next_new_file(td);
-
- if (!f || td_io_open_file(td, f))
+ if (!f)
return 1;
goto set_file;