Skip to content

Commit c641fc4

Browse files
committed
Use recursion for unblocking
1 parent b6fa00a commit c641fc4

File tree

1 file changed

+23
-32
lines changed

1 file changed

+23
-32
lines changed

src/runtime/dependency_graph.rs

Lines changed: 23 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -165,8 +165,22 @@ impl DependencyGraph {
165165
database_key: DatabaseKeyIndex,
166166
wait_result: WaitResult,
167167
) {
168-
// If `database_key` is `c` and it has been transfered to `b` earlier, remove its entry.
169-
tracing::debug!("unblock_transferred_queries({database_key:?}");
168+
fn unblock_recursive(
169+
me: &mut DependencyGraph,
170+
query: DatabaseKeyIndex,
171+
wait_result: WaitResult,
172+
) {
173+
me.transferred.remove(&query);
174+
if let Some(transitive) = me.transferred_dependents.remove(&query) {
175+
for query in transitive {
176+
me.unblock_runtimes_blocked_on(query, wait_result);
177+
unblock_recursive(me, query, wait_result);
178+
}
179+
}
180+
}
181+
182+
// If `database_key` is `c` and it has been transferred to `b` earlier, remove its entry.
183+
tracing::trace!("unblock_transferred_queries({database_key:?}");
170184
if let Some((_, owner)) = self.transferred.remove(&database_key) {
171185
let owner_dependents = self.transferred_dependents.get_mut(&owner).unwrap();
172186
let index = owner_dependents
@@ -176,24 +190,7 @@ impl DependencyGraph {
176190
owner_dependents.swap_remove(index);
177191
}
178192

179-
let mut unblocked: SmallVec<[_; 4]> = SmallVec::new();
180-
let mut queue: SmallVec<[_; 4]> = smallvec![database_key];
181-
182-
while let Some(current) = queue.pop() {
183-
self.transferred.remove(&current);
184-
let transitive = self
185-
.transferred_dependents
186-
.remove(&current)
187-
.unwrap_or_default();
188-
189-
queue.extend(transitive);
190-
191-
unblocked.push(current);
192-
}
193-
194-
for query in unblocked {
195-
self.unblock_runtimes_blocked_on(query, wait_result);
196-
}
193+
unblock_recursive(self, database_key, wait_result);
197194
}
198195

199196
/// Returns `Ok(thread_id)` if `database_key_index` is a query who's lock ownership has been transferred to `thread_id` (potentially over multiple steps)
@@ -392,7 +389,7 @@ impl DependencyGraph {
392389
}
393390

394391
fn update_transferred_edges(&mut self, query: DatabaseKeyIndex, new_owner_thread: ThreadId) {
395-
tracing::info!("Resuming transitive dependents of query {query:?}");
392+
tracing::trace!("Resuming transitive dependents of query {query:?}");
396393

397394
let mut queue: SmallVec<[_; 4]> = smallvec![query];
398395

@@ -418,17 +415,11 @@ impl DependencyGraph {
418415
edge.blocked_on_id
419416
);
420417
edge.blocked_on_id = new_owner_thread;
421-
}
422-
423-
#[cfg(debug_assertions)]
424-
{
425-
for id in self.query_dependents.get(&query).into_iter().flatten() {
426-
debug_assert!(
427-
!self.depends_on(new_owner_thread, *id),
428-
"Circular reference between blocked edges: {:#?}",
429-
self.edges
430-
);
431-
}
418+
debug_assert!(
419+
!DependencyGraph::depends_on_impl(&self.edges, new_owner_thread, *dependent),
420+
"Circular reference between blocked edges: {:#?}",
421+
self.edges
422+
);
432423
}
433424
}
434425
}

0 commit comments

Comments
 (0)