1
1
use crate :: {
2
- metrics, server_axum:: api_orchestrator_integration_impls:: * , Error , Result ,
3
- StreamingCoordinatorIdleSnafu , StreamingCoordinatorSpawnSnafu , StreamingExecuteSnafu ,
4
- WebSocketTaskPanicSnafu ,
2
+ metrics:: { self , record_metric, Endpoint , HasLabelsCore , Outcome } ,
3
+ server_axum:: api_orchestrator_integration_impls:: * ,
4
+ Error , Result , StreamingCoordinatorIdleSnafu , StreamingCoordinatorSpawnSnafu ,
5
+ StreamingExecuteSnafu , WebSocketTaskPanicSnafu ,
5
6
} ;
6
7
7
8
use axum:: extract:: ws:: { Message , WebSocket } ;
8
9
use futures:: { Future , FutureExt } ;
9
10
use orchestrator:: coordinator:: { self , Coordinator , DockerBackend } ;
10
11
use snafu:: prelude:: * ;
11
12
use std:: {
12
- convert:: { TryFrom , TryInto } ,
13
+ convert:: TryFrom ,
13
14
sync:: {
14
15
atomic:: { AtomicU64 , Ordering } ,
15
16
Arc ,
@@ -451,10 +452,16 @@ async fn handle_msg(txt: String, tx: &ResponseTx, manager: &mut CoordinatorManag
451
452
}
452
453
}
453
454
454
- macro_rules! return_if_closed {
455
+ #[ derive( Debug ) ]
456
+ enum CompletedOrAbandoned < T > {
457
+ Abandoned ,
458
+ Completed ( T ) ,
459
+ }
460
+
461
+ macro_rules! abandon_if_closed {
455
462
( $sent: expr) => {
456
463
if $sent. is_err( ) {
457
- return Ok ( ( ) ) ;
464
+ return Ok ( CompletedOrAbandoned :: Abandoned ) ;
458
465
}
459
466
} ;
460
467
}
@@ -466,8 +473,36 @@ async fn handle_execute(
466
473
meta : Meta ,
467
474
) -> ExecuteResult < ( ) > {
468
475
use execute_error:: * ;
476
+ use CompletedOrAbandoned :: * ;
477
+
478
+ let req = coordinator:: ExecuteRequest :: try_from ( req) . context ( BadRequestSnafu ) ?;
479
+
480
+ let labels_core = req. labels_core ( ) ;
481
+
482
+ let start = Instant :: now ( ) ;
483
+ let v = handle_execute_inner ( tx, coordinator, req, meta) . await ;
484
+ let elapsed = start. elapsed ( ) ;
469
485
470
- let req = req. try_into ( ) . context ( BadRequestSnafu ) ?;
486
+ let outcome = match & v {
487
+ Ok ( Abandoned ) => Outcome :: Abandoned ,
488
+ Ok ( Completed ( v) ) => * v,
489
+ Err ( _) => Outcome :: ErrorServer ,
490
+ } ;
491
+
492
+ record_metric ( Endpoint :: Execute , labels_core, outcome, elapsed) ;
493
+
494
+ v?;
495
+ Ok ( ( ) )
496
+ }
497
+
498
+ async fn handle_execute_inner (
499
+ tx : ResponseTx ,
500
+ coordinator : SharedCoordinator ,
501
+ req : coordinator:: ExecuteRequest ,
502
+ meta : Meta ,
503
+ ) -> ExecuteResult < CompletedOrAbandoned < Outcome > > {
504
+ use execute_error:: * ;
505
+ use CompletedOrAbandoned :: * ;
471
506
472
507
let coordinator:: ActiveExecution {
473
508
mut task,
@@ -478,7 +513,7 @@ async fn handle_execute(
478
513
let sent = tx
479
514
. send ( Ok ( MessageResponse :: ExecuteBegin { meta : meta. clone ( ) } ) )
480
515
. await ;
481
- return_if_closed ! ( sent) ;
516
+ abandon_if_closed ! ( sent) ;
482
517
483
518
let send_stdout = |payload| async {
484
519
let meta = meta. clone ( ) ;
@@ -498,38 +533,41 @@ async fn handle_execute(
498
533
499
534
Some ( stdout) = stdout_rx. recv( ) => {
500
535
let sent = send_stdout( stdout) . await ;
501
- return_if_closed !( sent) ;
536
+ abandon_if_closed !( sent) ;
502
537
} ,
503
538
504
539
Some ( stderr) = stderr_rx. recv( ) => {
505
540
let sent = send_stderr( stderr) . await ;
506
- return_if_closed !( sent) ;
541
+ abandon_if_closed !( sent) ;
507
542
} ,
508
543
}
509
544
} ;
510
545
511
546
// Drain any remaining output
512
547
while let Some ( Some ( stdout) ) = stdout_rx. recv ( ) . now_or_never ( ) {
513
548
let sent = send_stdout ( stdout) . await ;
514
- return_if_closed ! ( sent) ;
549
+ abandon_if_closed ! ( sent) ;
515
550
}
516
551
517
552
while let Some ( Some ( stderr) ) = stderr_rx. recv ( ) . now_or_never ( ) {
518
553
let sent = send_stderr ( stderr) . await ;
519
- return_if_closed ! ( sent) ;
554
+ abandon_if_closed ! ( sent) ;
520
555
}
521
556
522
- let coordinator:: ExecuteResponse { success } = status. context ( EndSnafu ) ?;
557
+ let status = status. context ( EndSnafu ) ?;
558
+ let outcome = Outcome :: from_success ( & status) ;
559
+
560
+ let coordinator:: ExecuteResponse { success } = status;
523
561
524
562
let sent = tx
525
563
. send ( Ok ( MessageResponse :: ExecuteEnd {
526
564
payload : ExecuteResponse { success } ,
527
565
meta,
528
566
} ) )
529
567
. await ;
530
- return_if_closed ! ( sent) ;
568
+ abandon_if_closed ! ( sent) ;
531
569
532
- Ok ( ( ) )
570
+ Ok ( Completed ( outcome ) )
533
571
}
534
572
535
573
#[ derive( Debug , Snafu ) ]
0 commit comments