Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fsync is not enough on OS X #49

Closed
djs55 opened this issue Aug 2, 2016 · 0 comments
Closed

fsync is not enough on OS X #49

djs55 opened this issue Aug 2, 2016 · 0 comments

Comments

@djs55
Copy link
Member

djs55 commented Aug 2, 2016

man fsync has:

Note that while fsync() will flush all data from the host to the drive (i.e.
the "permanent storage device"), the drive itself may not physically write the
data to the platters for quite some time and it may be written in an out-of-
order sequence.
?
Specifically, if the drive loses power or the OS crashes, the application may
find that only some or none of their data was written. The disk drive may
also re-order the data so that later writes may be present, while earlier
writes are not.

This is not a theoretical edge case. This scenario is easily reproduced with
real world workloads and drive power failures.

For applications that require tighter guarantees about the integrity of their
data, Mac OS X provides the F_FULLFSYNC fcntl. The F_FULLFSYNC fcntl asks the
drive to flush all buffered data to permanent storage. Applications, such as
databases, that require a strict ordering of writes should use F_FULLFSYNC to
ensure that their data is written in the order they expect. Please see
fcntl(2) for more detail.

man fnctl has:

F_FULLFSYNC Does the same thing as fsync(2) then asks the drive to
flush all buffered data to the permanent storage device
(arg is ignored). This is currently implemented on HFS,
MS-DOS (FAT), and Universal Disk Format (UDF) file systems.
The operation may take quite a while to complete. Certain
FireWire drives have also been known to ignore the request
to flush their buffered data.

hyperkit has ioctl(fd, DKIOCSYNCHRONIZECACHE)

From this book it looks like fcntl(F_FULLFSYNC) flushes journals before ultimately calling ioctl(fd, DKIOCSYNCHRONIZECACHE)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant