@@ -5,9 +5,8 @@ use crate::protocol::{
5
5
SubscribeReasonCode , UnsubAck , UnsubAckReason ,
6
6
} ;
7
7
use crate :: router:: alertlog:: alert;
8
- use crate :: router:: graveyard:: SavedState ;
9
8
use crate :: router:: scheduler:: { PauseReason , Tracker } ;
10
- use crate :: router:: Forward ;
9
+ use crate :: router:: { ConnectionEvents , Forward } ;
11
10
use crate :: segments:: Position ;
12
11
use crate :: * ;
13
12
use flume:: { bounded, Receiver , RecvError , Sender , TryRecvError } ;
@@ -304,23 +303,36 @@ impl Router {
304
303
// Retrieve previous connection state from graveyard
305
304
let saved = self . graveyard . retrieve ( & client_id) ;
306
305
let clean_session = connection. clean ;
307
- let previous_session = saved. is_some ( ) ;
306
+ let previous_session = saved. as_ref ( ) . is_some_and ( |s| s . session_state . is_some ( ) ) ;
308
307
// for qos2 pending pubrels
309
308
let mut pending_acks = VecDeque :: new ( ) ;
309
+
310
310
let tracker = if !clean_session {
311
- let saved = saved. map_or ( SavedState :: new ( client_id. clone ( ) ) , |s| s) ;
312
- connection. subscriptions = saved. subscriptions ;
313
- connection. events = saved. metrics ;
314
- // for using in acklog
315
- pending_acks = saved. unacked_pubrels . clone ( ) ;
316
- outgoing. unacked_pubrels = saved. unacked_pubrels ;
317
- saved. tracker
311
+ // if there was some saved state, restore the metrics
312
+ // and get the session's state if present
313
+ let saved_state = saved. and_then ( |saved| {
314
+ connection. events = saved. metrics ;
315
+ saved. session_state
316
+ } ) ;
317
+
318
+ // if session's state is present, restore that session
319
+ // otherwise, just start new one
320
+ saved_state. map_or_else (
321
+ || Tracker :: new ( client_id. clone ( ) ) ,
322
+ |session_state| {
323
+ connection. subscriptions = session_state. subscriptions ;
324
+ // for using in acklog
325
+ pending_acks = session_state. unacked_pubrels . clone ( ) ;
326
+ outgoing. unacked_pubrels = session_state. unacked_pubrels ;
327
+ session_state. tracker
328
+ } ,
329
+ )
318
330
} else {
319
331
// Only retrieve metrics in clean session
320
- let saved = saved. map_or ( SavedState :: new ( client_id. clone ( ) ) , |s| s) ;
321
- connection. events = saved. metrics ;
332
+ connection. events = saved. map_or_else ( ConnectionEvents :: default, |s| s. metrics ) ;
322
333
Tracker :: new ( client_id. clone ( ) )
323
334
} ;
335
+
324
336
let ackslog = AckLog :: new ( ) ;
325
337
326
338
let time = match SystemTime :: now ( ) . duration_since ( SystemTime :: UNIX_EPOCH ) {
@@ -503,20 +515,17 @@ impl Router {
503
515
}
504
516
}
505
517
506
- self . graveyard . save (
518
+ self . graveyard . save_state (
507
519
tracker,
508
520
connection. subscriptions ,
509
521
connection. events ,
510
522
outgoing. unacked_pubrels ,
511
523
) ;
512
524
} else {
525
+ tracker. pause ( PauseReason :: Busy ) ;
526
+ let id = tracker. id . clone ( ) ;
513
527
// Only save metrics in clean session
514
- self . graveyard . save (
515
- Tracker :: new ( client_id) ,
516
- HashSet :: new ( ) ,
517
- connection. events ,
518
- VecDeque :: new ( ) ,
519
- ) ;
528
+ self . graveyard . save_metrics ( id, connection. events ) ;
520
529
}
521
530
self . router_meters . total_connections -= 1 ;
522
531
}
@@ -1657,10 +1666,14 @@ fn print_status(router: &mut Router, metrics: Print) {
1657
1666
1658
1667
let metrics = match metrics {
1659
1668
Some ( v) => Some ( v) ,
1660
- None => router
1661
- . graveyard
1662
- . retrieve ( & id)
1663
- . map ( |v| ( v. metrics , v. tracker ) ) ,
1669
+ None => router. graveyard . retrieve ( & id) . map ( |v| {
1670
+ (
1671
+ v. metrics ,
1672
+ v. session_state
1673
+ . map ( |s| s. tracker )
1674
+ . unwrap_or ( Tracker :: new ( id) ) ,
1675
+ )
1676
+ } ) ,
1664
1677
} ;
1665
1678
1666
1679
println ! ( "{metrics:#?}" ) ;
0 commit comments