Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Batch mark waiters as unblocked when resuming in the deadlock handler #138874

Merged
merged 3 commits into from
Mar 26, 2025

Conversation

Zoxc
Copy link
Contributor

@Zoxc Zoxc commented Mar 24, 2025

This fixes a race when resuming multiple threads to resolve query cycles. This now marks all threads as unblocked before resuming any of them. Previously if one was resumed and marked as unblocked at a time. The first thread resumed could fall asleep then Rayon would detect a second false deadlock. Later the initial deadlock handler thread would resume further threads.

This also reverts the workaround added in #137731.

cc @SparrowLii @lqd

@rustbot
Copy link
Collaborator

rustbot commented Mar 24, 2025

r? @davidtwco

rustbot has assigned @davidtwco.
They will have a look at your PR within the next two weeks and either review your PR or reassign to another reviewer.

Use r? to explicitly pick a reviewer

@rustbot rustbot added A-query-system Area: The rustc query system (https://rustc-dev-guide.rust-lang.org/query.html) S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Mar 24, 2025
@@ -232,7 +225,8 @@ impl QueryLatch {
info.complete = true;
let registry = rayon_core::Registry::current();
for waiter in info.waiters.drain(..) {
waiter.notify(&registry);
rayon_core::mark_unblocked(&registry);
waiter.condvar.notify_one();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we also need to unblock all the waiters first here,which helps reduce the chance of deadlocks due to work-stealing?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, this runs on an active Rayon thread, which prevents it from hitting the deadlock handler until all threads are unblocked.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, it makes sense

@davidtwco
Copy link
Member

@bors r=SparrowLii,davidtwco

@bors
Copy link
Contributor

bors commented Mar 24, 2025

📌 Commit 38c39ff has been approved by SparrowLii,davidtwco

It is now in the queue for this repository.

@bors bors added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Mar 24, 2025
bors added a commit to rust-lang-ci/rust that referenced this pull request Mar 26, 2025
Rollup of 11 pull requests

Successful merges:

 - rust-lang#138128 (Stabilize `#![feature(precise_capturing_in_traits)]`)
 - rust-lang#138834 (Group test diffs by stage in post-merge analysis)
 - rust-lang#138867 (linker: Fix staticlib naming for UEFI)
 - rust-lang#138874 (Batch mark waiters as unblocked when resuming in the deadlock handler)
 - rust-lang#138875 (Trusty: Fix build for anonymous pipes and std::sys::process)
 - rust-lang#138877 (Ignore doctests only in specified targets)
 - rust-lang#138885 (Fix ui pattern_types test for big-endian platforms)
 - rust-lang#138905 (Add target maintainer information for powerpc64-unknown-linux-musl)
 - rust-lang#138911 (Allow defining opaques in statics and consts)
 - rust-lang#138917 (rustdoc: remove useless `Symbol::is_empty` checks.)
 - rust-lang#138945 (Override PartialOrd methods for bool)

r? `@ghost`
`@rustbot` modify labels: rollup
@bors bors merged commit 8b61871 into rust-lang:master Mar 26, 2025
6 checks passed
@rustbot rustbot added this to the 1.87.0 milestone Mar 26, 2025
rust-timer added a commit to rust-lang-ci/rust that referenced this pull request Mar 26, 2025
Rollup merge of rust-lang#138874 - Zoxc:waiter-race, r=SparrowLii,davidtwco

Batch mark waiters as unblocked when resuming in the deadlock handler

This fixes a race when resuming multiple threads to resolve query cycles. This now marks all threads as unblocked before resuming  any of them. Previously if one was resumed and marked as unblocked at a time. The first thread resumed could fall asleep then Rayon would detect a second false deadlock. Later the initial deadlock handler thread would resume further threads.

This also reverts the workaround added in rust-lang#137731.

cc `@SparrowLii` `@lqd`
@Zoxc Zoxc deleted the waiter-race branch March 26, 2025 08:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-query-system Area: The rustc query system (https://rustc-dev-guide.rust-lang.org/query.html) S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants