@@ -278,8 +278,7 @@ pub(crate) fn on_task_update(
278278 task_id,
279279 rv_id : rv_id,
280280 } => {
281- task_reject ( core, & mut * comm, worker_id, task_id, rv_id) ;
282- need_scheduling = true ;
281+ need_scheduling |= task_reject ( core, & mut * comm, worker_id, task_id, rv_id) ;
283282 }
284283 WorkerTaskUpdate :: EnableRequest {
285284 resource_rq_id : rq_id,
@@ -393,19 +392,23 @@ fn task_reject(
393392 worker_id : WorkerId ,
394393 task_id : TaskId ,
395394 resource_rq_variant : ResourceVariantId ,
396- ) {
395+ ) -> bool {
397396 let CoreSplitMut {
398397 task_map,
399398 task_queues,
400399 worker_map,
401400 request_map,
401+ scheduler_state,
402402 ..
403403 } = core. split_mut ( ) ;
404404 let Some ( task) = task_map. find_task_mut ( task_id) else {
405405 log:: debug!( "Unknown task rejected id={task_id}" ) ;
406- return ;
406+ return false ;
407407 } ;
408408 log:: debug!( "Task id={task_id} (variant={resource_rq_variant}) rejected on worker={worker_id}" ) ;
409+ let worker = worker_map. get_worker_mut ( worker_id) ;
410+ let resource_rq_id = task. resource_rq_id ;
411+ worker. block_request ( resource_rq_id, resource_rq_variant) ;
409412 match & task. state {
410413 TaskRuntimeState :: Assigned {
411414 worker_id : w_id,
@@ -417,12 +420,35 @@ fn task_reject(
417420 if resource_rq_variant != * rv_id {
418421 log:: debug!( "Rejection from invalid worker" ) ;
419422 }
423+ let rq = request_map. get ( resource_rq_id) . get ( resource_rq_variant) ;
424+ worker. remove_sn_task ( task_id, rq) ;
420425 }
421- TaskRuntimeState :: Prefilled { .. } => {
422- todo ! ( )
426+ TaskRuntimeState :: Prefilled { worker_id : w_id } => {
427+ if worker_id != * w_id {
428+ log:: debug!( "Rejection from invalid worker" ) ;
429+ }
430+ worker. remove_prefill_task ( task_id) ;
431+ task_queues
432+ . get_mut ( resource_rq_id)
433+ . remove_prefilled ( task_id) ;
423434 }
424- TaskRuntimeState :: Retracting { .. } => {
425- todo ! ( )
435+ TaskRuntimeState :: Retracting { worker_id : w_id } => {
436+ if worker_id != * w_id {
437+ log:: debug!( "Rejection from invalid worker" ) ;
438+ return false ;
439+ }
440+ if let Some ( ( target_id, rv_id) ) = scheduler_state. redirects . remove ( & task_id) {
441+ log:: debug!( "Transfering to {target_id}" ) ;
442+ task. state = TaskRuntimeState :: Assigned {
443+ worker_id : target_id,
444+ rv_id,
445+ } ;
446+ comm. send_worker_message (
447+ target_id,
448+ & ComputeTasksBuilder :: single_task ( task, rv_id, Vec :: new ( ) ) ,
449+ ) ;
450+ return false ;
451+ }
426452 }
427453 TaskRuntimeState :: Waiting { .. }
428454 | TaskRuntimeState :: Running { .. }
@@ -432,15 +458,10 @@ fn task_reject(
432458 }
433459 } ;
434460 task. state = TaskRuntimeState :: Waiting { unfinished_deps : 0 } ;
435- let resource_rq_id = task. resource_rq_id ;
436461 let mut retracted = Vec :: new ( ) ;
437462 task_queues. add_ready_task ( & task, & mut retracted) ;
438463 process_retracted ( task_map, worker_map, comm, retracted) ;
439- let rq = request_map. get ( resource_rq_id) . get ( resource_rq_variant) ;
440-
441- let worker = worker_map. get_worker_mut ( worker_id) ;
442- worker. remove_sn_task ( task_id, rq) ;
443- worker. block_request ( resource_rq_id, resource_rq_variant) ;
464+ true
444465}
445466
446467fn request_enabled (
@@ -615,6 +636,7 @@ fn task_failed(
615636 worker_map,
616637 request_map,
617638 task_queues,
639+ scheduler_state,
618640 ..
619641 } = core. split_mut ( ) ;
620642 if let Some ( task) = task_map. find_task ( task_id) {
@@ -649,6 +671,16 @@ fn task_failed(
649671 . get_worker_mut ( worker_id)
650672 . remove_prefill_task ( task_id) ;
651673 }
674+ TaskRuntimeState :: Retracting { worker_id : w } => {
675+ assert_eq ! ( worker_id, * w) ;
676+ try_remove_redirection (
677+ worker_map,
678+ scheduler_state,
679+ request_map,
680+ task_id,
681+ task. resource_rq_id ,
682+ ) ;
683+ }
652684 _ => { }
653685 }
654686 }
0 commit comments