@@ -112,16 +112,23 @@ struct SessionHistoryRow<Status> {
112112 role : Role ,
113113 status : Status ,
114114 error_message : Option < String > ,
115+ fallback_available : bool ,
115116}
116117
117118impl < Status : StatusText > fmt:: Display for SessionHistoryRow < Status > {
118119 fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
120+ let status_text = match ( self . error_message . as_deref ( ) , self . fallback_available ) {
121+ ( Some ( err) , _) => err. to_string ( ) ,
122+ ( None , true ) =>
123+ format ! ( "{}, Fallback transaction available" , self . status. status_text( ) ) ,
124+ ( None , false ) => self . status . status_text ( ) . to_string ( ) ,
125+ } ;
119126 write ! (
120127 f,
121128 "{:<W_ID$} {:<W_ROLE$} {:<W_STATUS$}" ,
122129 self . session_id. to_string( ) ,
123130 self . role. as_str( ) ,
124- self . error_message . as_deref ( ) . unwrap_or ( self . status . status_text( ) )
131+ status_text
125132 )
126133 }
127134}
@@ -400,12 +407,15 @@ impl AppTrait for App {
400407 self . db . get_send_session_ids ( ) ?. into_iter ( ) . for_each ( |session_id| {
401408 let persister = SenderPersister :: from_id ( self . db . clone ( ) , session_id. clone ( ) ) ;
402409 match replay_sender_event_log ( & persister) {
403- Ok ( ( sender_state, _) ) => {
410+ Ok ( ( sender_state, _session_history) ) => {
411+ let fallback_available =
412+ matches ! ( sender_state, SendSession :: Closed ( SenderSessionOutcome :: Aborted ) ) ;
404413 let row = SessionHistoryRow {
405414 session_id,
406415 role : Role :: Sender ,
407416 status : sender_state. clone ( ) ,
408417 error_message : None ,
418+ fallback_available,
409419 } ;
410420 send_rows. push ( row) ;
411421 }
@@ -415,6 +425,7 @@ impl AppTrait for App {
415425 role : Role :: Sender ,
416426 status : SendSession :: Closed ( SenderSessionOutcome :: Aborted ) ,
417427 error_message : Some ( e. to_string ( ) ) ,
428+ fallback_available : false ,
418429 } ;
419430 send_rows. push ( row) ;
420431 }
@@ -424,12 +435,17 @@ impl AppTrait for App {
424435 self . db . get_recv_session_ids ( ) ?. into_iter ( ) . for_each ( |session_id| {
425436 let persister = ReceiverPersister :: from_id ( self . db . clone ( ) , session_id. clone ( ) ) ;
426437 match replay_receiver_event_log ( & persister) {
427- Ok ( ( receiver_state, _) ) => {
438+ Ok ( ( receiver_state, session_history) ) => {
439+ let fallback_available = matches ! (
440+ receiver_state,
441+ ReceiveSession :: Closed ( ReceiverSessionOutcome :: Aborted )
442+ ) && session_history. fallback_tx ( ) . is_some ( ) ;
428443 let row = SessionHistoryRow {
429444 session_id,
430445 role : Role :: Receiver ,
431446 status : receiver_state. clone ( ) ,
432447 error_message : None ,
448+ fallback_available,
433449 } ;
434450 recv_rows. push ( row) ;
435451 }
@@ -439,6 +455,7 @@ impl AppTrait for App {
439455 role : Role :: Receiver ,
440456 status : ReceiveSession :: Closed ( ReceiverSessionOutcome :: Aborted ) ,
441457 error_message : Some ( e. to_string ( ) ) ,
458+ fallback_available : false ,
442459 } ;
443460 recv_rows. push ( row) ;
444461 }
@@ -449,11 +466,14 @@ impl AppTrait for App {
449466 let persister = SenderPersister :: from_id ( self . db . clone ( ) , session_id. clone ( ) ) ;
450467 match replay_sender_event_log ( & persister) {
451468 Ok ( ( sender_state, _) ) => {
469+ let fallback_available =
470+ matches ! ( sender_state, SendSession :: Closed ( SenderSessionOutcome :: Aborted ) ) ;
452471 let row = SessionHistoryRow {
453472 session_id,
454473 role : Role :: Sender ,
455474 status : sender_state. clone ( ) ,
456475 error_message : None ,
476+ fallback_available,
457477 } ;
458478 send_rows. push ( row) ;
459479 }
@@ -463,6 +483,7 @@ impl AppTrait for App {
463483 role : Role :: Sender ,
464484 status : SendSession :: Closed ( SenderSessionOutcome :: Aborted ) ,
465485 error_message : Some ( e. to_string ( ) ) ,
486+ fallback_available : false ,
466487 } ;
467488 send_rows. push ( row) ;
468489 }
@@ -472,12 +493,17 @@ impl AppTrait for App {
472493 self . db . get_inactive_recv_session_ids ( ) ?. into_iter ( ) . for_each ( |( session_id, _) | {
473494 let persister = ReceiverPersister :: from_id ( self . db . clone ( ) , session_id. clone ( ) ) ;
474495 match replay_receiver_event_log ( & persister) {
475- Ok ( ( receiver_state, _) ) => {
496+ Ok ( ( receiver_state, session_history) ) => {
497+ let fallback_available = matches ! (
498+ receiver_state,
499+ ReceiveSession :: Closed ( ReceiverSessionOutcome :: Aborted )
500+ ) && session_history. fallback_tx ( ) . is_some ( ) ;
476501 let row = SessionHistoryRow {
477502 session_id,
478503 role : Role :: Receiver ,
479504 status : receiver_state. clone ( ) ,
480505 error_message : None ,
506+ fallback_available,
481507 } ;
482508 recv_rows. push ( row) ;
483509 }
@@ -487,6 +513,7 @@ impl AppTrait for App {
487513 role : Role :: Receiver ,
488514 status : ReceiveSession :: Closed ( ReceiverSessionOutcome :: Aborted ) ,
489515 error_message : Some ( e. to_string ( ) ) ,
516+ fallback_available : false ,
490517 } ;
491518 recv_rows. push ( row) ;
492519 }
0 commit comments