ignore: gracefully quit worker threads upon panic in ParallelVisitor #3010
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Fixes #3009.
Problem
WalkParallel::visit()
will nondeterministically hang if theParallelVisitor::visit()
implementation panics. This also occurs when providing a closure toWalkParallel::run()
. Minimal repro is provided in #3009:The above code will nondeterministically hang, because of an infinite loop when no new work is available:
ripgrep/crates/ignore/src/walk.rs
Lines 1695 to 1707 in de4baa1
Solution
quit_now
flag in our wait loop.run()
method and setquit_now
before propagating the panic.Breaking change: In order to ensure soundness, we also enforce that the filter method provided to
WalkBuilder#filter_entry()
isUnwindSafe
. Users can circumvent this by wrapping inAssertUnwindSafe
as needed.Result
The added test
panic_in_parallel()
always succeeds instead of hanging.