Comments (4)
Boost.Filesystem (and std::filesystem) is generally not protected against filesystem races. The behavior is undefined if the filesystem is modified concurrently with Boost.Filesystem operations. This is by design.
That said, Boost.Filesystem takes some measures to protect itself from filesystem races, when possible. The amount and robustness of such protection is not guaranteed and should not be relied upon (i.e. it is a matter of QoI). In particular, directory_iterator
does not construct directory_entry
in the normal way, and initializes its cached status and symlink status, when this information is made available by the OS during iteration. In this case, the race you describe should not happen because refresh()
won't be implicitly called.
from filesystem.
I would ask you to reconsider, due to following reason: there is no easy way for calling code to add workaround in this case, because the race condition happens inside the Boost.Filesystem itself. So it is worth to add a workaround inside the library.
In Boost.Filesystem v3 the exception would happen not inside the increment of the iterator, but when calling code would attempt to do anything with the directory_entry
. And in such case the workaround can be implemented in calling code.
In this case, the race you describe should not happen because refresh() won't be implicitly called.
Well, the documentation explicitly says that for Boost.Filesystem v4 the refresh()
is called.
So is there a contradiction between the documentation and the implementation?
Also, debugging shows that refresh()
is indeed called during increment of the iterator.
(Let me know if you need a sample code to reproduce the issue.)
Another consideration is: calling refresh()
always for each directory_entry
is a performance penalty (additional syscall) in both Linux and Windows.
from filesystem.
I would ask you to reconsider, due to following reason: there is no easy way for calling code to add workaround in this case, because the race condition happens inside the Boost.Filesystem itself. So it is worth to add a workaround inside the library.
Preserving status obtained during iteration is the workaround. If this information is not provided by the OS, there is no other way the library could obtain status information other than to query the filesystem, which may result in a filesystem race.
And I'll reiterate, whether the OS provides file status on iteration or not, user's code must be prepared that incrementing or dereferencing a directory iterator can fail (with an exception or an error code) for a multitude of reasons, filesystem race being just one of them.
So is there a contradiction between the documentation and the implementation?
No, the effects described in the documentation are maintained, provided that there is no filesystem race. As I said, with a filesystem race, the behavior is undefined.
Also, debugging shows that
refresh()
is indeed called during increment of the iterator.
(Let me know if you need a sample code to reproduce the issue.)
Does this reproduce on the current develop
? On what OS and filesystem? If this happens on develop
, I would like a reproducer, please.
from filesystem.
Well, the documentation explicitly says that for Boost.Filesystem v4 the
refresh()
is called.
Also, I'll reiterate that the documentation doesn't say this. The directory_entry
constructor from path calls refresh()
, yes, but directory_iterator::operator++()
doesn't call that constructor.
from filesystem.
Related Issues (20)
- error_code parameter not reset in directory_entry::status() HOT 4
- `copy_file()` racing with truncation of `from` file results in endless loop HOT 1
- last_write_time returns invalid time_t HOT 4
- Cannot use with Unreal Engine HOT 1
- Build failure with the clang toolset. HOT 1
- Jamfile inccorectly adds `-Wl,no-undefined` when sanitizers are used HOT 1
- `fs::unique_path()` segfaults under mingw with `-fno-rtti` HOT 23
- Missing forward slash (/) constraint in documentation for generic format observers HOT 4
- `weakly_canonical` doesn't always return an absolute path HOT 29
- Behavior of `absolute("")` in v4 HOT 8
- boost::filesystem::exist link error using clang-cl toolset. HOT 1
- Error code 32 when multiple threads use `fs::rename` on the same file. HOT 1
- copy_file error on ARM64 + Docker environment - Invalid cross-device link HOT 2
- Regression in `equivalent` in boost 1.85.0 over 1.83.0 (or am I doing something wrong?) HOT 2
- Boost winapi file_management dwReserved bug? HOT 3
- On MSVC, `relative(const path& p, const path& base)` does not work if one path has Windows long path style HOT 1
- weakly_canonical doesn't seem to work on Windows on pathes starting with "../" HOT 2
- If a folder doesn't have read/write access, if (!(permission & fs::perms::owner_read) == fs::perms::no_perms) will always return success. HOT 1
- boost::filesystem::file_size returns 0 for symbolic links on Windows HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from filesystem.