@@ -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