@@ -370,15 +370,13 @@ impl MachineMonitor {
370370 info ! ( "Sending frame complete report: {}" , frame) ;
371371
372372 // Release resources
373- if let Some ( threads) = & frame. thread_ids {
374- self . release_threads ( threads) . await ;
375- } else {
376- // Ensure the division rounds up if num_cores is not a multiple of
377- // core_multiplier
378- let num_cores_to_release = ( frame. request . num_cores as u32 )
379- . div_ceil ( self . maching_config . core_multiplier ) ;
380- self . release_cores ( num_cores_to_release) . await ;
381- }
373+ // Ensure the division rounds up if num_cores is not a multiple of
374+ // core_multiplier
375+ let num_cores_to_release =
376+ ( frame. request . num_cores as u32 ) . div_ceil ( self . maching_config . core_multiplier ) ;
377+
378+ self . release_cores ( num_cores_to_release, & frame. thread_ids )
379+ . await ;
382380
383381 // Send complete report
384382 if let Err ( err) = self
@@ -471,19 +469,14 @@ pub trait Machine {
471469 /// Vector of successfully reserved CPU core IDs
472470 async fn reserve_cores_by_id ( & self , thread_ids : & [ u32 ] , resource_id : Uuid ) -> Result < Vec < u32 > > ;
473471
474- /// Release specific threads
475- ///
476- /// # Arguments
477- ///
478- /// * `threads` - Vector of thread IDs to release
479- async fn release_threads ( & self , thread_ids : & [ u32 ] ) ;
480-
481472 /// Releases a specified number of CPU cores
482473 ///
483474 /// # Arguments
484475 ///
485476 /// * `num_cores` - The number of cores to release
486- async fn release_cores ( & self , num_cores : u32 ) ;
477+ /// * `thread_ids` - List of threads to be released, None means the reservation didn't
478+ /// allocate specific threads
479+ async fn release_cores ( & self , num_cores : u32 , thread_ids : & Option < Vec < u32 > > ) ;
487480
488481 /// Reserve GPU units
489482 ///
@@ -585,11 +578,15 @@ impl Machine for MachineMonitor {
585578 // Record reservation to be reported to cuebot
586579 if cores_result. is_ok ( ) {
587580 let mut core_state = self . core_state . lock ( ) . await ;
588- debug ! ( "Before: {:?}" , * core_state) ;
589- core_state
590- . reserve ( num_cores * self . maching_config . core_multiplier as usize )
591- . map_err ( |err| miette ! ( err) ) ?;
592- debug ! ( "After: {:?}" , * core_state) ;
581+ debug ! ( "Reservation: Before: {:?}" , * core_state) ;
582+ if let Err ( err) = core_state
583+ . register_reservation ( num_cores * self . maching_config . core_multiplier as usize )
584+ . map_err ( |err| miette ! ( err) )
585+ {
586+ error ! ( "Accountability Error: {err}" ) ;
587+ Err ( err) ?;
588+ }
589+ debug ! ( "Reservation: After: {:?}" , * core_state) ;
593590 }
594591 cores_result
595592 }
@@ -605,52 +602,46 @@ impl Machine for MachineMonitor {
605602
606603 // Record reservation to be reported to cuebot
607604 let mut core_state = self . core_state . lock ( ) . await ;
608- core_state
609- . reserve ( thread_ids. len ( ) * self . maching_config . core_multiplier as usize )
610- . map_err ( |err| miette ! ( err) ) ?;
605+ debug ! ( "Reservation: Before: {:?}" , * core_state) ;
606+ if let Err ( err) = core_state
607+ . register_reservation ( thread_ids. len ( ) * self . maching_config . core_multiplier as usize )
608+ . map_err ( |err| miette ! ( err) )
609+ {
610+ error ! ( "Accountability Error: {err}" ) ;
611+ Err ( err) ?;
612+ }
613+ debug ! ( "Reservation: After: {:?}" , * core_state) ;
611614
612615 Ok ( thread_ids)
613616 }
614617
615- async fn release_threads ( & self , thread_ids : & [ u32 ] ) {
616- let mut released_cores = HashSet :: new ( ) ;
617- {
618- let mut system = self . system_manager . lock ( ) . await ;
619- for thread_id in thread_ids {
620- match system. release_core_by_thread ( thread_id) {
621- Ok ( ( phys_id, core_id) ) => {
622- released_cores. insert ( ( phys_id, core_id) ) ;
623- }
624- Err ( err) => match err {
625- ReservationError :: ReservationNotFound ( _) => {
626- // NoOp. When releasing a thread, the entire core might be released,
627- // threfore misses are expected
628- }
629- _ => {
630- error ! ( "Failed to release proc {thread_id}. Unexpected error" )
618+ async fn release_cores ( & self , num_cores : u32 , thread_ids : & Option < Vec < u32 > > ) {
619+ if let Some ( thread_ids) = thread_ids {
620+ let mut released_cores = HashSet :: new ( ) ;
621+ {
622+ let mut system = self . system_manager . lock ( ) . await ;
623+ for thread_id in thread_ids {
624+ match system. release_core_by_thread ( thread_id) {
625+ Ok ( ( phys_id, core_id) ) => {
626+ released_cores. insert ( ( phys_id, core_id) ) ;
631627 }
632- } ,
628+ Err ( err) => match err {
629+ ReservationError :: ReservationNotFound ( _) => {
630+ // NoOp. When releasing a thread, the entire core might be released,
631+ // threfore misses are expected
632+ }
633+ _ => {
634+ error ! ( "Failed to release proc {thread_id}. Unexpected error" )
635+ }
636+ } ,
637+ }
633638 }
634639 }
635640 }
636641 // Record reservation to be reported to cuebot
637642 let mut core_state = self . core_state . lock ( ) . await ;
638643 if let Err ( err) = core_state
639- . release ( released_cores. len ( ) as u32 * self . maching_config . core_multiplier )
640- . map_err ( |err| miette ! ( err) )
641- {
642- error ! (
643- "Accountability error. Failed to release the requested number of cores. {}" ,
644- err
645- )
646- } ;
647- }
648-
649- async fn release_cores ( & self , num_cores : u32 ) {
650- // Record reservation to be reported to cuebot
651- let mut core_state = self . core_state . lock ( ) . await ;
652- if let Err ( err) = core_state
653- . release ( num_cores * self . maching_config . core_multiplier )
644+ . register_release ( num_cores * self . maching_config . core_multiplier )
654645 . map_err ( |err| miette ! ( err) )
655646 {
656647 error ! (
0 commit comments