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

Feature wish: Unix.fsync, etc. #2533

Closed
vicuna opened this issue Apr 30, 2004 · 10 comments
Closed

Feature wish: Unix.fsync, etc. #2533

vicuna opened this issue Apr 30, 2004 · 10 comments

Comments

@vicuna
Copy link

vicuna commented Apr 30, 2004

Original bug ID: 2533
Reporter: administrator
Assigned to: @damiendoligez
Status: resolved (set by @nojb on 2018-07-31T11:41:11Z)
Resolution: fixed
Priority: normal
Severity: feature
Category: otherlibs
Tags: patch
Monitored by: @nojb mfp mehdi @ygrek @dbuenzli @mmottl

Bug description

Hi,

having to write a very filesystem-oriented system, I am in need of system
calls for synchronizing the in-core state of files and directories with
that on disk.

It would be nice to see the following easily implementable system calls
in the Unix-module (currently I'm working with extensions):

val fsync : file_descr -> unit
val fdatasync : file_descr -> unit
val dirfd : dir_handle -> file_descr

The last function (BSD, the other two are POSIX.1b) is needed, because
synchronizing data with fdatasync (and also metadata + data with fsync)
does not synchronize the directory entries as such. For this it is
necessary to extract the file descriptor from the directory stream and
explicitly call fsync on it.

If there are reasons not to exhibit the file_descr associated with a
dir_handle, a function "val dir_sync : dir_handle -> unit" would also
be a possibility.

It may be too inefficient to open files with every write being
synchronized (O_SYNC, etc.). Sometimes I even only want the directory
to be synchronized, not the data.

Best regards,
Markus

--
Markus Mottl http://www.oefai.at/~markus markus@oefai.at

@vicuna
Copy link
Author

vicuna commented Feb 25, 2010

Comment author: @mmottl

This has been around for a really long time. I think at least the following POSIX system calls concerning syncing should be supported: sync and fsync. They are available on virtually every Unix system and indispensable for applications that need persistence guarantees.

Note that fdatasync is not supported on FreeBSD and Mac OS X.

@vicuna
Copy link
Author

vicuna commented Mar 20, 2010

Comment author: @avsm

fsync(2) is also more relaxed on MacOS X; it needs the F_FULLFSYNC fcntl to ensure it actually hits the disk in-order.

@vicuna
Copy link
Author

vicuna commented Mar 30, 2010

Comment author: @mshinwell

Markus, do you have a pre-existing patch for this (or could you construct one) which could be looked at?

@vicuna
Copy link
Author

vicuna commented Mar 30, 2010

Comment author: @mmottl

Yes, just take a look at our Core-library, file "unix_ext_stubs.c". It contains a function "unix_fsync" that can surely be taken verbatim.

There are several other functions there that could probably be added to the OCaml distribution immediately, because they are well-standardized in POSIX and do not require elaborate API additions (types, etc.). E.g. pselect, abort, sync.

Some of the others are also well-standardized, but would need extra types, etc. I'm not sure what the OCaml team's preferred procedure for adding those would be.

@vicuna
Copy link
Author

vicuna commented May 30, 2014

Comment author: @mshinwell

Damien, do you have an opinion on adding these? (I'm just asking given what you said about Set.map ...)

@vicuna
Copy link
Author

vicuna commented Jun 15, 2018

Comment author: berenger

I'm also surprised today by the lack of fsync in the stdlib's Unix module...
adding an external dependency to a project just for that looks insane

@vicuna
Copy link
Author

vicuna commented Jun 15, 2018

Comment author: berenger

https://github.com/janestreet/core/blob/f96a6f75611713b77b95c62568020f20d8f81ef7/src/unix_stubs.c

contains:

CAMLprim value unix_fsync(value v_fd)
{
int ret;
caml_enter_blocking_section();
ret = fsync(Int_val(v_fd));
caml_leave_blocking_section();
if (ret == -1) uerror("fsync", Nothing);
return Val_unit;
}

@vicuna
Copy link
Author

vicuna commented Jun 15, 2018

Comment author: berenger

#1839

@vicuna
Copy link
Author

vicuna commented Jul 31, 2018

Comment author: berenger

the corresponding PR on github has been merged, so this issue can probably be closed

@vicuna
Copy link
Author

vicuna commented Jul 31, 2018

Comment author: @nojb

The PR only implements the fsync call, there seem to be others that are important by the previous discussion. But since this issue has been open for 14 years, I will go ahead and close it. If needed a new one can be opened for the other functions.

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

No branches or pull requests

2 participants