HomeFreeBSD

ZIL: Cleanup sync and commit handling

Description

ZIL: Cleanup sync and commit handling

ZVOL:

  • Mark all ZVOL ZIL transactions as sync. Since ZVOLs have only

one object, it makes no sense to maintain async queue and on each
commit merge it into sync. Single sync queue is just cheaper, while
it changes nothing until actual commit request arrives.

  • Remove zsd_sync_cnt and the zil_async_to_sync() calls since we

are no longer switching between sync and async queues.

ZFS:

  • Mark write transactions as sync based only on number of sync

opens (z_sync_cnt). We can not randomly jump between sync and
async unless we want data corruptions due to writes reordering.

  • When file first opened with O_SYNC (z_sync_cnt incremented to 1)

call zil_async_to_sync() for it to preserve correct ordering between
past and future writes.

  • Drop zfs_fsyncer_key logic. Looks like it was an optimization

for workloads heavily intermixing async writes with tons of fsyncs.
But first it was broken 8 years ago due to Linux tsd implementation
not allowing data storage between syscalls, and second, I doubt it
is safe to switch from async to sync so often and without calling
zil_async_to_sync().

  • Rename sync argument of *_log_write() into commit, now only

signalling caller's intent to call zil_commit() soon after. It
allows WR_COPIED optimizations without extra other meanings.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: George Wilson <george.wilson@delphix.com>
Signed-off-by: Alexander Motin <mav@FreeBSD.org>
Sponsored by: iXsystems, Inc.
Closes #15366

Details

Provenance
mavAuthored on Oct 30 2023, 9:51 PM
GitHub <noreply@github.com>Committed on Oct 30 2023, 9:51 PM
Parents
rG043c6ee3b6bf: Read prefetched buffers from L2ARC
Branches
Unknown
Tags
Unknown