You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
create_all will fail when the directory already exists. Having two threads copying files to the same directory, this may result in an a File exists error.
Notable exception is made for situations where any of the directories specified in the path could not be created as it was being created concurrently. Such cases are considered to be successful. That is, calling create_dir_all concurrently from multiple threads or processes is guaranteed not to fail due to a race condition with itself.
I think it makes sense to implement the same logic here.
The text was updated successfully, but these errors were encountered:
Digging a bit into this, I guess the issue is more complex.
create_all and create say:
This function will return an error in the following situations, but is not limited to just these cases:
[…]
path already exists if erase set false.
However, create_all uses DirBuilder with recursive(true), in which case the docs say:
It is considered an error if the directory already exists unless recursive mode is enabled.
So create_all will succeed with an existing directory, while crate will fail. crate will also fail if erase is true, in case of another race condition.
My proposal would be to simply change the create function to ignore the "directory exists" error.
ctron
added a commit
to ctron/fs_extra
that referenced
this issue
Aug 24, 2023
Align behavior of dir::create and dir::create_all to not report an
existing directory as error. Fixing race conditions when running
multiple copy operations in parallel.
I believe there is a race condition when recursively copying:
fs_extra/src/dir.rs
Lines 604 to 609 in 1754296
create_all
will fail when the directory already exists. Having two threads copying files to the same directory, this may result in an aFile exists
error.The my understanding
tokio
compensates for this by ignoring this case as an error: https://docs.rs/tokio/latest/tokio/fs/fn.create_dir_all.htmlI think it makes sense to implement the same logic here.
The text was updated successfully, but these errors were encountered: