@@ -36,7 +36,14 @@ use crate::{
3636 event:: command:: CommandEvent ,
3737 id_set:: IdSet ,
3838 operation:: OverrideCriteriaFn ,
39- options:: { ClientOptions , DatabaseOptions , ReadPreference , SelectionCriteria , ServerAddress } ,
39+ options:: {
40+ ClientOptions ,
41+ DatabaseOptions ,
42+ DriverInfo ,
43+ ReadPreference ,
44+ SelectionCriteria ,
45+ ServerAddress ,
46+ } ,
4047 sdam:: {
4148 server_selection:: { self , attempt_to_select_server} ,
4249 SelectedServer ,
@@ -380,6 +387,16 @@ impl Client {
380387 . map ( |db_name| self . database ( db_name) )
381388 }
382389
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+
383400 pub ( crate ) fn register_async_drop ( & self ) -> AsyncDropToken {
384401 let ( cleanup_tx, cleanup_rx) = tokio:: sync:: oneshot:: channel :: < BoxFuture < ' static , ( ) > > ( ) ;
385402 let ( id_tx, id_rx) = tokio:: sync:: oneshot:: channel :: < crate :: id_set:: Id > ( ) ;
@@ -418,7 +435,7 @@ impl Client {
418435 /// Check in a server session to the server session pool. The session will be discarded if it is
419436 /// expired or dirty.
420437 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 ( ) ;
422439 self . inner . session_pool . check_in ( session, timeout) . await ;
423440 }
424441
@@ -481,12 +498,12 @@ impl Client {
481498 timeout,
482499 ) ;
483500 #[ 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 ( ) ) ;
485502 // We only want to emit this message once per operation at most.
486503 #[ cfg( feature = "tracing-unstable" ) ]
487504 let mut emitted_waiting_message = false ;
488505
489- let mut watcher = self . inner . topology . watch ( ) ;
506+ let mut watcher = self . inner . topology . watcher ( ) . clone ( ) ;
490507 loop {
491508 let state = watcher. observe_latest ( ) ;
492509 let override_slot;
@@ -550,8 +567,7 @@ impl Client {
550567
551568 #[ cfg( all( test, feature = "dns-resolver" ) ) ]
552569 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 ( ) ;
555571
556572 state
557573 . servers ( )
@@ -562,17 +578,12 @@ impl Client {
562578
563579 #[ cfg( test) ]
564580 pub ( crate ) async fn sync_workers ( & self ) {
565- self . inner . topology . sync_workers ( ) . await ;
581+ self . inner . topology . updater ( ) . sync_workers ( ) . await ;
566582 }
567583
568584 #[ cfg( test) ]
569585 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 ( )
576587 }
577588
578589 #[ cfg( test) ]
@@ -588,7 +599,7 @@ impl Client {
588599 . options
589600 . server_selection_timeout
590601 . unwrap_or ( DEFAULT_SERVER_SELECTION_TIMEOUT ) ;
591- let mut watcher = self . inner . topology . watch ( ) ;
602+ let mut watcher = self . inner . topology . watcher ( ) . clone ( ) ;
592603 loop {
593604 let topology = watcher. observe_latest ( ) ;
594605 if let Some ( desc) = topology. description . primary ( ) {
@@ -628,7 +639,7 @@ impl Client {
628639 // The maximum number of session IDs that should be sent in a single endSessions command.
629640 const MAX_END_SESSIONS_BATCH_SIZE : usize = 10_000 ;
630641
631- let mut watcher = self . inner . topology . watch ( ) ;
642+ let mut watcher = self . inner . topology . watcher ( ) . clone ( ) ;
632643 let selection_criteria =
633644 SelectionCriteria :: from ( ReadPreference :: PrimaryPreferred { options : None } ) ;
634645
0 commit comments