Rust crate implementing robust waiting for file to be created.
If your application has to wait for another application to create a file at certain path it's not entirely obvious how to do it without race conditions. This crate helps with that and provides a very simple API. See the shorthand functions provided in this crate first - you likely only need one of them.
It uses inotify
which is available in Linux only to wait for the file. notify
crate was
specifically not used to ensure high robustness. PRs to add other platforms will be accepted if I
can not see race conditions or other bugs in them.
use std::io::Read;
let mut file = wait_file_created::robust_wait_read("my/expected/file").unwrap();
let mut contents = String::new();
file.read_to_string(&mut contents).unwrap();
As you can see the function returns an already-opened file which minimizes risk of race conditions. Unfortunately it can not be entirely elliminated in all scenarios.
This library can not guarantee that the file opened was written completely. Specifically, if the application writing it has created it before your application attempted to open it but is still writing after that time then your application will observe incomplete data.
You must ensure that your application can handle incomplete data or (much better) ensure that the application creating the file does so atomically - that is create a temporary file first, write to it and then move it over to the final destination. The library is specifically designed to handle this scenario so you may rely on that.
Note that in Linux there is another mechanism for atomically creating files.
A file can be opened using O_TMPFILE
which creates an anonymous file.
After populating it it can be linked to the directory using linkat()
syscall.
If an application is using this method the notfication will only be received after the
file descriptor is closed even though it would be safe to open it after it was created.
The assume_create_is_atomic()
method can be used to indicate that and request the file to be
opened right away. This may improve performance or in case the application wants to keep the
file descriptor opened it ensures the code functions at all. The same method can be used if the
file is supposed to be empty.
MITNFA