@@ -36,7 +36,14 @@ use crate::{
36
36
event:: command:: CommandEvent ,
37
37
id_set:: IdSet ,
38
38
operation:: OverrideCriteriaFn ,
39
- options:: { ClientOptions , DatabaseOptions , ReadPreference , SelectionCriteria , ServerAddress } ,
39
+ options:: {
40
+ ClientOptions ,
41
+ DatabaseOptions ,
42
+ DriverInfo ,
43
+ ReadPreference ,
44
+ SelectionCriteria ,
45
+ ServerAddress ,
46
+ } ,
40
47
sdam:: {
41
48
server_selection:: { self , attempt_to_select_server} ,
42
49
SelectedServer ,
@@ -380,6 +387,16 @@ impl Client {
380
387
. map ( |db_name| self . database ( db_name) )
381
388
}
382
389
390
+ /// Append new information to the metadata of the handshake with the server.
391
+ pub fn append_metadata ( & self , driver_info : DriverInfo ) -> Result < ( ) > {
392
+ self . inner
393
+ . topology
394
+ . metadata
395
+ . write ( )
396
+ . unwrap ( )
397
+ . append ( driver_info)
398
+ }
399
+
383
400
pub ( crate ) fn register_async_drop ( & self ) -> AsyncDropToken {
384
401
let ( cleanup_tx, cleanup_rx) = tokio:: sync:: oneshot:: channel :: < BoxFuture < ' static , ( ) > > ( ) ;
385
402
let ( id_tx, id_rx) = tokio:: sync:: oneshot:: channel :: < crate :: id_set:: Id > ( ) ;
@@ -418,7 +435,7 @@ impl Client {
418
435
/// Check in a server session to the server session pool. The session will be discarded if it is
419
436
/// expired or dirty.
420
437
pub ( crate ) async fn check_in_server_session ( & self , session : ServerSession ) {
421
- let timeout = self . inner . topology . logical_session_timeout ( ) ;
438
+ let timeout = self . inner . topology . watcher ( ) . logical_session_timeout ( ) ;
422
439
self . inner . session_pool . check_in ( session, timeout) . await ;
423
440
}
424
441
@@ -481,12 +498,12 @@ impl Client {
481
498
timeout,
482
499
) ;
483
500
#[ cfg( feature = "tracing-unstable" ) ]
484
- event_emitter. emit_started_event ( self . inner . topology . watch ( ) . observe_latest ( ) . description ) ;
501
+ event_emitter. emit_started_event ( self . inner . topology . latest ( ) . description . clone ( ) ) ;
485
502
// We only want to emit this message once per operation at most.
486
503
#[ cfg( feature = "tracing-unstable" ) ]
487
504
let mut emitted_waiting_message = false ;
488
505
489
- let mut watcher = self . inner . topology . watch ( ) ;
506
+ let mut watcher = self . inner . topology . watcher ( ) . clone ( ) ;
490
507
loop {
491
508
let state = watcher. observe_latest ( ) ;
492
509
let override_slot;
@@ -550,8 +567,7 @@ impl Client {
550
567
551
568
#[ cfg( all( test, feature = "dns-resolver" ) ) ]
552
569
pub ( crate ) fn get_hosts ( & self ) -> Vec < String > {
553
- let watcher = self . inner . topology . watch ( ) ;
554
- let state = watcher. peek_latest ( ) ;
570
+ let state = self . inner . topology . latest ( ) ;
555
571
556
572
state
557
573
. servers ( )
@@ -562,17 +578,12 @@ impl Client {
562
578
563
579
#[ cfg( test) ]
564
580
pub ( crate ) async fn sync_workers ( & self ) {
565
- self . inner . topology . sync_workers ( ) . await ;
581
+ self . inner . topology . updater ( ) . sync_workers ( ) . await ;
566
582
}
567
583
568
584
#[ cfg( test) ]
569
585
pub ( crate ) fn topology_description ( & self ) -> crate :: sdam:: TopologyDescription {
570
- self . inner
571
- . topology
572
- . watch ( )
573
- . peek_latest ( )
574
- . description
575
- . clone ( )
586
+ self . inner . topology . latest ( ) . description . clone ( )
576
587
}
577
588
578
589
#[ cfg( test) ]
@@ -588,7 +599,7 @@ impl Client {
588
599
. options
589
600
. server_selection_timeout
590
601
. unwrap_or ( DEFAULT_SERVER_SELECTION_TIMEOUT ) ;
591
- let mut watcher = self . inner . topology . watch ( ) ;
602
+ let mut watcher = self . inner . topology . watcher ( ) . clone ( ) ;
592
603
loop {
593
604
let topology = watcher. observe_latest ( ) ;
594
605
if let Some ( desc) = topology. description . primary ( ) {
@@ -628,7 +639,7 @@ impl Client {
628
639
// The maximum number of session IDs that should be sent in a single endSessions command.
629
640
const MAX_END_SESSIONS_BATCH_SIZE : usize = 10_000 ;
630
641
631
- let mut watcher = self . inner . topology . watch ( ) ;
642
+ let mut watcher = self . inner . topology . watcher ( ) . clone ( ) ;
632
643
let selection_criteria =
633
644
SelectionCriteria :: from ( ReadPreference :: PrimaryPreferred { options : None } ) ;
634
645
0 commit comments