Rollup merge of #119086 - RossSmyth:query_panics, r=compiler-errors

Query panic!() to useful diagnostic

Changes some more ICEs from bare panic!()s

Adds an `expect_job()` helper method as that is a moral equivalent of what was happening at the uses.

re:#118955
This commit is contained in:
León Orell Valerian Liehr 2024-01-03 16:08:23 +01:00 committed by GitHub
commit 093bd0888a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -44,6 +44,18 @@ enum QueryResult {
Poisoned,
}
impl QueryResult {
/// Unwraps the query job expecting that it has started.
fn expect_job(self) -> QueryJob {
match self {
Self::Started(job) => job,
Self::Poisoned => {
panic!("job for query failed to start and was poisoned")
}
}
}
}
impl<K> QueryState<K>
where
K: Eq + Hash + Copy + Debug,
@ -169,10 +181,7 @@ where
let job = {
let mut lock = state.active.lock_shard_by_value(&key);
match lock.remove(&key).unwrap() {
QueryResult::Started(job) => job,
QueryResult::Poisoned => panic!(),
}
lock.remove(&key).unwrap().expect_job()
};
job.signal_complete();
@ -190,10 +199,8 @@ where
let state = self.state;
let job = {
let mut shard = state.active.lock_shard_by_value(&self.key);
let job = match shard.remove(&self.key).unwrap() {
QueryResult::Started(job) => job,
QueryResult::Poisoned => panic!(),
};
let job = shard.remove(&self.key).unwrap().expect_job();
shard.insert(self.key, QueryResult::Poisoned);
job
};
@ -277,11 +284,14 @@ where
// We didn't find the query result in the query cache. Check if it was
// poisoned due to a panic instead.
let lock = query.query_state(qcx).active.get_shard_by_value(&key).lock();
match lock.get(&key) {
// The query we waited on panicked. Continue unwinding here.
Some(QueryResult::Poisoned) => FatalError.raise(),
Some(QueryResult::Poisoned) => {
panic!("query '{}' not cached due to poisoning", query.name())
}
_ => panic!(
"query result must in the cache or the query must be poisoned after a wait"
"query '{}' result must be in the cache or the query must be poisoned after a wait",
query.name()
),
}
})