@@ -23,7 +23,13 @@ impl TaskExplanationForWorker {
2323 pub fn n_enabled_variants ( & self ) -> u32 {
2424 self . variants
2525 . iter ( )
26- . map ( |v| if v. is_empty ( ) { 1 } else { 0 } )
26+ . map ( |v| {
27+ if v. iter ( ) . any ( |item| item. is_blocking ( ) ) {
28+ 0
29+ } else {
30+ 1
31+ }
32+ } )
2733 . sum ( )
2834 }
2935
@@ -40,7 +46,7 @@ impl TaskExplanationForWorker {
4046pub enum TaskExplainItem {
4147 Time {
4248 min_time : Duration ,
43- remaining_time : Duration ,
49+ remaining_time : Option < Duration > ,
4450 } ,
4551 Resources {
4652 resource : String ,
@@ -53,6 +59,30 @@ pub enum TaskExplainItem {
5359 } ,
5460}
5561
62+ impl TaskExplainItem {
63+ pub fn is_blocking ( & self ) -> bool {
64+ match self {
65+ TaskExplainItem :: Time {
66+ min_time,
67+ remaining_time : Some ( remaining_time) ,
68+ } => min_time > remaining_time,
69+ TaskExplainItem :: Time {
70+ min_time : _,
71+ remaining_time : None ,
72+ } => false ,
73+ TaskExplainItem :: Resources {
74+ resource : _,
75+ request_amount,
76+ worker_amount,
77+ } => request_amount > worker_amount,
78+ TaskExplainItem :: WorkerGroup {
79+ n_nodes,
80+ group_size,
81+ } => n_nodes > group_size,
82+ }
83+ }
84+ }
85+
5686pub fn task_explain_init ( task : & Task ) -> TaskExplanation {
5787 TaskExplanation {
5888 n_task_deps : task. task_deps . len ( ) as u32 ,
@@ -80,35 +110,29 @@ pub fn task_explain_for_worker(
80110 . iter ( )
81111 . map ( |rq| {
82112 let mut result = Vec :: new ( ) ;
83- if let Some ( remaining_time) = worker. remaining_time ( now) {
84- if rq. min_time ( ) > remaining_time {
85- result. push ( TaskExplainItem :: Time {
86- min_time : rq. min_time ( ) ,
87- remaining_time,
88- } ) ;
89- }
113+ if !rq. min_time ( ) . is_zero ( ) {
114+ result. push ( TaskExplainItem :: Time {
115+ min_time : rq. min_time ( ) ,
116+ remaining_time : worker. remaining_time ( now) ,
117+ } ) ;
90118 }
91119 if rq. is_multi_node ( ) {
92- if rq. n_nodes ( ) > worker_group. size ( ) as NumOfNodes {
93- result. push ( TaskExplainItem :: WorkerGroup {
94- n_nodes : rq. n_nodes ( ) ,
95- group_size : worker_group. size ( ) as NumOfNodes ,
96- } )
97- }
120+ result. push ( TaskExplainItem :: WorkerGroup {
121+ n_nodes : rq. n_nodes ( ) ,
122+ group_size : worker_group. size ( ) as NumOfNodes ,
123+ } )
98124 } else {
99125 for entry in rq. entries ( ) {
100126 let request_amount = entry. request . min_amount ( ) ;
101127 let worker_amount = worker. resources . get ( entry. resource_id ) ;
102- if request_amount > worker_amount {
103- result. push ( TaskExplainItem :: Resources {
104- resource : resource_map
105- . get_name ( entry. resource_id )
106- . unwrap ( )
107- . to_string ( ) ,
108- request_amount,
109- worker_amount,
110- } )
111- }
128+ result. push ( TaskExplainItem :: Resources {
129+ resource : resource_map
130+ . get_name ( entry. resource_id )
131+ . unwrap ( )
132+ . to_string ( ) ,
133+ request_amount,
134+ worker_amount,
135+ } )
112136 }
113137 }
114138 result
@@ -157,32 +181,37 @@ mod tests {
157181 let task = TaskBuilder :: new ( task_id) . build ( ) ;
158182 let r = explain ( & task, & worker1, now) ;
159183 assert_eq ! ( r. variants. len( ) , 1 ) ;
160- assert ! ( r. variants[ 0 ] . is_empty( ) ) ;
184+ assert_eq ! ( r. variants[ 0 ] . len( ) , 1 ) ;
185+ assert_eq ! ( r. n_enabled_variants( ) , 1 ) ;
161186
162187 let task = TaskBuilder :: new ( task_id) . time_request ( 20_000 ) . build ( ) ;
163188 let r = explain ( & task, & worker1, now) ;
164189 assert_eq ! ( r. variants. len( ) , 1 ) ;
165- assert ! ( r. variants[ 0 ] . is_empty( ) ) ;
190+ assert_eq ! ( r. variants[ 0 ] . len( ) , 2 ) ;
191+ assert_eq ! ( r. n_enabled_variants( ) , 1 ) ;
166192
167193 let r = explain ( & task, & worker2, now) ;
168194 assert_eq ! ( r. variants. len( ) , 1 ) ;
169- assert ! ( r. variants[ 0 ] . is_empty( ) ) ;
195+ assert_eq ! ( r. variants[ 0 ] . len( ) , 2 ) ;
196+ assert_eq ! ( r. n_enabled_variants( ) , 1 ) ;
170197
171198 let now2 = now + Duration :: from_secs ( 21_000 ) ;
172199 let r = explain ( & task, & worker1, now2) ;
173200 assert_eq ! ( r. variants. len( ) , 1 ) ;
174- assert ! ( r. variants[ 0 ] . is_empty( ) ) ;
201+ assert_eq ! ( r. variants[ 0 ] . len( ) , 2 ) ;
202+ assert_eq ! ( r. n_enabled_variants( ) , 1 ) ;
175203
176204 let r = explain ( & task, & worker2, now2) ;
177205 assert_eq ! ( r. variants. len( ) , 1 ) ;
178- assert_eq ! ( r. variants[ 0 ] . len( ) , 1 ) ;
206+ assert_eq ! ( r. variants[ 0 ] . len( ) , 2 ) ;
179207 assert ! ( matches!(
180208 r. variants[ 0 ] [ 0 ] ,
181209 TaskExplainItem :: Time {
182210 min_time,
183211 remaining_time,
184- } if min_time == Duration :: from_secs( 20_000 ) && remaining_time == Duration :: from_secs( 19_000 )
212+ } if min_time == Duration :: from_secs( 20_000 ) && remaining_time == Some ( Duration :: from_secs( 19_000 ) )
185213 ) ) ;
214+ assert_eq ! ( r. n_enabled_variants( ) , 0 ) ;
186215
187216 let task = TaskBuilder :: new ( task_id)
188217 . time_request ( 20_000 )
@@ -191,13 +220,14 @@ mod tests {
191220 . build ( ) ;
192221 let r = explain ( & task, & worker2, now) ;
193222 assert_eq ! ( r. variants. len( ) , 1 ) ;
194- assert_eq ! ( r. variants[ 0 ] . len( ) , 1 ) ;
223+ assert_eq ! ( r. variants[ 0 ] . len( ) , 3 ) ;
195224 assert ! ( matches!(
196- & r. variants[ 0 ] [ 0 ] ,
225+ & r. variants[ 0 ] [ 1 ] ,
197226 TaskExplainItem :: Resources {
198227 resource, request_amount, worker_amount
199228 } if resource == "cpus" && * request_amount == ResourceAmount :: new_units( 30 ) && * worker_amount == ResourceAmount :: new_units( 10 )
200229 ) ) ;
230+ assert_eq ! ( r. n_enabled_variants( ) , 0 ) ;
201231
202232 let task = TaskBuilder :: new ( task_id)
203233 . time_request ( 30_000 )
@@ -210,13 +240,13 @@ mod tests {
210240 let r = explain ( & task, & worker2, now2) ;
211241 assert_eq ! ( r. variants. len( ) , 2 ) ;
212242 assert_eq ! ( r. variants[ 0 ] . len( ) , 3 ) ;
213- assert_eq ! ( r. variants[ 1 ] . len( ) , 1 ) ;
243+ assert_eq ! ( r. variants[ 1 ] . len( ) , 2 ) ;
214244 assert ! ( matches!(
215245 r. variants[ 0 ] [ 0 ] ,
216246 TaskExplainItem :: Time {
217247 min_time,
218248 remaining_time,
219- } if min_time == Duration :: from_secs( 30_000 ) && remaining_time == Duration :: from_secs( 19_000 )
249+ } if min_time == Duration :: from_secs( 30_000 ) && remaining_time == Some ( Duration :: from_secs( 19_000 ) )
220250 ) ) ;
221251 assert ! ( matches!(
222252 & r. variants[ 0 ] [ 1 ] ,
@@ -231,7 +261,7 @@ mod tests {
231261 } if resource == "gpus" && * request_amount == ResourceAmount :: new_units( 8 ) && * worker_amount == ResourceAmount :: new_units( 4 )
232262 ) ) ;
233263 assert ! ( matches!(
234- & r. variants[ 1 ] [ 0 ] ,
264+ & r. variants[ 1 ] [ 1 ] ,
235265 TaskExplainItem :: Resources {
236266 resource, request_amount, worker_amount
237267 } if resource == "gpus" && * request_amount == ResourceAmount :: new_units( 32 ) && * worker_amount == ResourceAmount :: new_units( 4 )
@@ -254,7 +284,8 @@ mod tests {
254284 let group = WorkerGroup :: new ( wset) ;
255285 let r = task_explain_for_worker ( & resource_map, & task, & worker, & group, now) ;
256286 assert_eq ! ( r. variants. len( ) , 1 ) ;
257- assert ! ( r. variants[ 0 ] . is_empty( ) ) ;
287+ assert_eq ! ( r. variants[ 0 ] . len( ) , 1 ) ;
288+ assert_eq ! ( r. n_enabled_variants( ) , 1 ) ;
258289
259290 let mut wset = Set :: new ( ) ;
260291 wset. insert ( WorkerId :: new ( 1 ) ) ;
@@ -270,5 +301,6 @@ mod tests {
270301 group_size: 2
271302 }
272303 ) ) ;
304+ assert_eq ! ( r. n_enabled_variants( ) , 0 ) ;
273305 }
274306}
0 commit comments