Skip to content

Commit

Permalink
FIO with fsync option issues more DDIR_SYNC commands than expected
Browse files Browse the repository at this point in the history
Issue and root cause:
When fsync option is used, the number of flush (or DDIR_SYNC) commands
issued is more than the expected number of flush commands.
To elaborate:
- In the fio config file, consider fsync=1
1. FIO issues 1 write command
2. After write completes, FIO sets last_was_sync variable to false
3. FIO issues 1 flush command
4. FIO keeps issuing flush commands since last_was_sync is still false
and this causes more flush commands to be issued than expected
5. last_was_sync is set to true after the flush command completes
- The above steps repeats until the workload is completed.
Fix:
Instead of setting last_was_sync to true after flush command is completed
and setting last_was_sync to false after write command is completed,
set last_was_sync to true after flush command is issued and set
last_was_sync to false after write command is issued.

Signed-off-by: Celestine Chen celestinechen@google.com
  • Loading branch information
celestinechen committed Apr 19, 2024
1 parent 420415d commit 673159e
Show file tree
Hide file tree
Showing 2 changed files with 4 additions and 2 deletions.
2 changes: 0 additions & 2 deletions io_u.c
Original file line number Diff line number Diff line change
Expand Up @@ -2113,7 +2113,6 @@ static void io_completed(struct thread_data *td, struct io_u **io_u_ptr,
if (ddir_sync(ddir)) {
if (io_u->error)
goto error;
td->last_was_sync = true;
if (f) {
f->first_write = -1ULL;
f->last_write = -1ULL;
Expand All @@ -2123,7 +2122,6 @@ static void io_completed(struct thread_data *td, struct io_u **io_u_ptr,
return;
}

td->last_was_sync = false;
td->last_ddir = ddir;

if (!io_u->error && ddir_rw(ddir)) {
Expand Down
4 changes: 4 additions & 0 deletions ioengines.c
Original file line number Diff line number Diff line change
Expand Up @@ -436,6 +436,8 @@ enum fio_q_status td_io_queue(struct thread_data *td, struct io_u *io_u)
io_u_mark_depth(td, 1);
td->ts.total_io_u[io_u->ddir]++;
}

td->last_was_sync = ddir_sync(io_u->ddir);
} else if (ret == FIO_Q_QUEUED) {
td->io_u_queued++;

Expand All @@ -445,6 +447,8 @@ enum fio_q_status td_io_queue(struct thread_data *td, struct io_u *io_u)

if (td->io_u_queued >= td->o.iodepth_batch)
td_io_commit(td);

td->last_was_sync = ddir_sync(io_u->ddir);
}

if (!td_ioengine_flagged(td, FIO_SYNCIO) &&
Expand Down

0 comments on commit 673159e

Please sign in to comment.