@@ -1658,8 +1658,7 @@ def add_task(
1658
1658
ts .dependencies .add (dep_ts )
1659
1659
dep_ts .dependents .add (ts )
1660
1660
1661
- if dep_ts .state in ("fetch" , "flight" ):
1662
- # if we _need_ to grab data or are in the process
1661
+ if dep_ts .state not in ("memory" ,):
1663
1662
ts .waiting_for_data .add (dep_ts .key )
1664
1663
1665
1664
self .update_who_has (who_has = who_has )
@@ -1762,9 +1761,6 @@ def transition_fetch_waiting(self, ts, runspec):
1762
1761
# clear `who_has` of stale info
1763
1762
ts .who_has .clear ()
1764
1763
1765
- # remove entry from dependents to avoid a spurious `gather_dep` call``
1766
- for dependent in ts .dependents :
1767
- dependent .waiting_for_data .discard (ts .key )
1768
1764
except Exception as e :
1769
1765
logger .exception (e )
1770
1766
if LOG_PDB :
@@ -1794,9 +1790,6 @@ def transition_flight_waiting(self, ts, runspec):
1794
1790
# clear `who_has` of stale info
1795
1791
ts .who_has .clear ()
1796
1792
1797
- # remove entry from dependents to avoid a spurious `gather_dep` call``
1798
- for dependent in ts .dependents :
1799
- dependent .waiting_for_data .discard (ts .key )
1800
1793
except Exception as e :
1801
1794
logger .exception (e )
1802
1795
if LOG_PDB :
@@ -1991,6 +1984,8 @@ def transition_executing_done(self, ts, value=no_value, report=True):
1991
1984
ts .traceback = msg ["traceback" ]
1992
1985
ts .state = "error"
1993
1986
out = "error"
1987
+ for d in ts .dependents :
1988
+ d .waiting_for_data .add (ts .key )
1994
1989
1995
1990
# Don't release the dependency keys, but do remove them from `dependents`
1996
1991
for dependency in ts .dependencies :
@@ -2621,12 +2616,12 @@ def release_key(
2621
2616
2622
2617
if self .validate :
2623
2618
assert isinstance (key , str )
2624
- ts = self .tasks .get (key , TaskState ( key = key ) )
2619
+ ts = self .tasks .get (key , None )
2625
2620
# If the scheduler holds a reference which is usually the
2626
2621
# case when it instructed the task to be computed here or if
2627
2622
# data was scattered we must not release it unless the
2628
2623
# scheduler allow us to. See also handle_delete_data and
2629
- if ts and ts .scheduler_holds_ref :
2624
+ if ts is None or ts .scheduler_holds_ref :
2630
2625
return
2631
2626
logger .debug (
2632
2627
"Release key %s" ,
@@ -2640,28 +2635,14 @@ def release_key(
2640
2635
self .log .append ((key , "release-key" , {"cause" : cause }, reason ))
2641
2636
else :
2642
2637
self .log .append ((key , "release-key" , reason ))
2643
- if key in self .data and not ts . dependents :
2638
+ if key in self .data :
2644
2639
try :
2645
2640
del self .data [key ]
2646
2641
except FileNotFoundError :
2647
2642
logger .error ("Tried to delete %s but no file found" , exc_info = True )
2648
- if key in self .actors and not ts . dependents :
2643
+ if key in self .actors :
2649
2644
del self .actors [key ]
2650
2645
2651
- # for any dependencies of key we are releasing remove task as dependent
2652
- for dependency in ts .dependencies :
2653
- dependency .dependents .discard (ts )
2654
-
2655
- if not dependency .dependents and dependency .state not in (
2656
- # don't boot keys that are in flight
2657
- # we don't know if they're already queued up for transit
2658
- # in a gather_dep callback
2659
- "flight" ,
2660
- # The same is true for already executing keys.
2661
- "executing" ,
2662
- ):
2663
- self .release_key (dependency .key , reason = f"Dependent { ts } released" )
2664
-
2665
2646
for worker in ts .who_has :
2666
2647
self .has_what [worker ].discard (ts .key )
2667
2648
ts .who_has .clear ()
@@ -2681,8 +2662,10 @@ def release_key(
2681
2662
# Inform the scheduler of keys which will have gone missing
2682
2663
# We are releasing them before they have completed
2683
2664
if ts .state in PROCESSING :
2665
+ # This path is only hit with work stealing
2684
2666
msg = {"op" : "release" , "key" : key , "cause" : cause }
2685
2667
else :
2668
+ # This path is only hit when calling release_key manually
2686
2669
msg = {
2687
2670
"op" : "release-worker-data" ,
2688
2671
"keys" : [key ],
@@ -2691,9 +2674,8 @@ def release_key(
2691
2674
self .batched_stream .send (msg )
2692
2675
2693
2676
self ._notify_plugins ("release_key" , key , ts .state , cause , reason , report )
2694
- if key in self .tasks and not ts .dependents :
2695
- self .tasks .pop (key )
2696
- del ts
2677
+ del self .tasks [key ]
2678
+
2697
2679
except CommClosedError :
2698
2680
pass
2699
2681
except Exception as e :
@@ -2704,32 +2686,6 @@ def release_key(
2704
2686
pdb .set_trace ()
2705
2687
raise
2706
2688
2707
- def rescind_key (self , key ):
2708
- try :
2709
- if self .tasks [key ].state not in PENDING :
2710
- return
2711
-
2712
- ts = self .tasks .pop (key )
2713
-
2714
- # Task has been rescinded
2715
- # For every task that it required
2716
- for dependency in ts .dependencies :
2717
- # Remove it as a dependent
2718
- dependency .dependents .remove (key )
2719
- # If the dependent is now without purpose (no dependencies), remove it
2720
- if not dependency .dependents :
2721
- self .release_key (
2722
- dependency .key , reason = "All dependent keys rescinded"
2723
- )
2724
-
2725
- except Exception as e :
2726
- logger .exception (e )
2727
- if LOG_PDB :
2728
- import pdb
2729
-
2730
- pdb .set_trace ()
2731
- raise
2732
-
2733
2689
################
2734
2690
# Execute Task #
2735
2691
################
0 commit comments