Don't hold the active queries lock while calling make_query
This commit is contained in:
parent
ad8304a0d5
commit
fd3d2d49f2
@ -69,6 +69,8 @@ where
|
|||||||
make_query: fn(Qcx, K) -> QueryStackFrame<D>,
|
make_query: fn(Qcx, K) -> QueryStackFrame<D>,
|
||||||
jobs: &mut QueryMap<D>,
|
jobs: &mut QueryMap<D>,
|
||||||
) -> Option<()> {
|
) -> Option<()> {
|
||||||
|
let mut active = Vec::new();
|
||||||
|
|
||||||
#[cfg(parallel_compiler)]
|
#[cfg(parallel_compiler)]
|
||||||
{
|
{
|
||||||
// We use try_lock_shards here since we are called from the
|
// We use try_lock_shards here since we are called from the
|
||||||
@ -77,8 +79,7 @@ where
|
|||||||
for shard in shards.iter() {
|
for shard in shards.iter() {
|
||||||
for (k, v) in shard.iter() {
|
for (k, v) in shard.iter() {
|
||||||
if let QueryResult::Started(ref job) = *v {
|
if let QueryResult::Started(ref job) = *v {
|
||||||
let query = make_query(qcx, *k);
|
active.push((*k, job.clone()));
|
||||||
jobs.insert(job.id, QueryJobInfo { query, job: job.clone() });
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -91,12 +92,18 @@ where
|
|||||||
// really hurt much.)
|
// really hurt much.)
|
||||||
for (k, v) in self.active.try_lock()?.iter() {
|
for (k, v) in self.active.try_lock()?.iter() {
|
||||||
if let QueryResult::Started(ref job) = *v {
|
if let QueryResult::Started(ref job) = *v {
|
||||||
let query = make_query(qcx, *k);
|
active.push((*k, job.clone()));
|
||||||
jobs.insert(job.id, QueryJobInfo { query, job: job.clone() });
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Call `make_query` while we're not holding a `self.active` lock as `make_query` may call
|
||||||
|
// queries leading to a deadlock.
|
||||||
|
for (key, job) in active {
|
||||||
|
let query = make_query(qcx, key);
|
||||||
|
jobs.insert(job.id, QueryJobInfo { query, job });
|
||||||
|
}
|
||||||
|
|
||||||
Some(())
|
Some(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user