Implement -ignore_readdir_race and -noignore_readdir_race.#411
Implement -ignore_readdir_race and -noignore_readdir_race.#411hanbings wants to merge 7 commits intouutils:mainfrom
-ignore_readdir_race and -noignore_readdir_race.#411Conversation
Codecov ReportAll modified and coverable lines are covered by tests ✅
Additional details and impacted files@@ Coverage Diff @@ ## main #411 +/- ## ========================================== + Coverage 66.25% 66.29% +0.03% ========================================== Files 34 34 Lines 4004 4017 +13 Branches 911 911 ========================================== + Hits 2653 2663 +10 - Misses 996 998 +2 - Partials 355 356 +1 ☔ View full report in Codecov by Sentry. |
| Commit f4bb537 has GNU testsuite comparison: |
| could you please document the fact that this option doesn't do anything ? |
Sorry for the late reply. In short, taking the test https://github.com/tavianator/bfs/blob/main/tests/gnu/ignore_readdir_race.sh as an example, during the execution of Wirte upI usually start by checking the GNU tests and the BFS tests for this parameter.
cd "$TEST" "$XTOUCH" foo bar # -links 1 forces a stat() call, which will fail for the second file invoke_bfs . -mindepth 1 -ignore_readdir_race -links 1 -exec "$TESTS/remove-sibling.sh" {} \;
#!/usr/bin/env bash for file in "${1%/*}"/*; do if [ "$file" != "$1" ]; then rm "$file" exit $? fi done exit 1I then ran the script on my local machine: Then I realized that our implementation didn't seem to have this problem in the same test. First we jump here from the main function, then turns to the parser fn do_find<'a>(args: &[&str], deps: &'a dyn Dependencies<'a>) -> Result<u64, Box<dyn Error>> { let paths_and_matcher = parse_args(args)?; ... }After getting all the matchers that meet the parameters, use found_count += process_dir( &path, &paths_and_matcher.config, deps, &*paths_and_matcher.matcher, &mut quit, );Here, while let Some(result) = it.next() { match result { Err(err) => { uucore::error::set_exit_code(1); writeln!(&mut stderr(), "Error: {dir}: {err}").unwrap() } Ok(entry) => { let mut matcher_io = matchers::MatcherIO::new(deps); if matcher.matches(&entry, &mut matcher_io) { found_count += 1; } ... } } }Finally, there is the part of ... match command.status() { Ok(status) => status.success(), Err(e) => { writeln!(&mut stderr(), "Failed to run {}: {}", self.executable, e).unwrap(); false } } ...Therefore, in the case of |
| oh, sorry, i just meant "in the code. explaining why it isn't doing anything" :) |
Ok, I've submitted the description in my latest commit. |
| Commit 7413637 has GNU testsuite comparison: |
| Commit c9a36d0 has GNU testsuite comparison: |
| Commit 9250adc has GNU testsuite comparison: |
| needs rebase |
| } | ||
| // In our implementation, including the `-exec` parameter, | ||
| // it is always run in a single thread. | ||
| // Therefore, there is no race condition for now. |
There was a problem hiding this comment.
The "race condition" that this flag is talking about is another command simultaneously modifying the directory while find is reading it, something like
tavianator@graphene $ touch {1..10000} tavianator@graphene $ find -size 1 & rm ./* [1] 65991 find: ‘./10000’: No such file or directory [1] + 65991 exit 1 find -size 1 tavianator@graphene $ touch {1..10000} tavianator@graphene $ find -ignore_readdir_race -size 1 & rm ./* [1] 66034 [1] + 66034 done find -ignore_readdir_race -size 1There was a problem hiding this comment.
Sorry, I forgot about this. The race condition does happen when deleting a large number of files, and I'm rewriting a piece of code that implements this feature.
There was a problem hiding this comment.
Terribly sorry, I did misunderstand the meaning of readdir_race.
I rechecked the code and read the GNU documentation. The -ignore_readdir_race parameter requires a way to suppress file not found errors globally in the software, so I need to complete #15 to centralize the error handling logic before I can return here.
I will finish them as soon as possible. :)
| Commit 2184e7c has GNU testsuite comparison: |
| needs rebasing |
| @hanbings do you have an update on this ? thanks :) |
| @hanbings any plan to finish it ? thanks :) |
This PR will pass the test about race conditions in BFS test. Our implementation does not seem to cause race conditions, so only add
Configrelated to-ignore_readdir_raceand-noignore_readdir_racewithout making other logical changes.Closes #377