@@ -35,6 +35,7 @@ use crate::{
3535 error:: { Error , ErrorKind , Result } ,
3636 event:: command:: CommandEvent ,
3737 id_set:: IdSet ,
38+ operation:: OverrideCriteriaFn ,
3839 options:: { ClientOptions , DatabaseOptions , ReadPreference , SelectionCriteria , ServerAddress } ,
3940 sdam:: {
4041 server_selection:: { self , attempt_to_select_server} ,
@@ -447,7 +448,7 @@ impl Client {
447448 criteria : Option < & SelectionCriteria > ,
448449 ) -> Result < ServerAddress > {
449450 let ( server, _) = self
450- . select_server ( criteria, "Test select server" , None , false )
451+ . select_server ( criteria, "Test select server" , None , |_ , _| None )
451452 . await ?;
452453 Ok ( server. address . clone ( ) )
453454 }
@@ -460,7 +461,7 @@ impl Client {
460461 #[ allow( unused_variables) ] // we only use the operation_name for tracing.
461462 operation_name : & str ,
462463 deprioritized : Option < & ServerAddress > ,
463- is_out_or_merge : bool ,
464+ override_criteria : OverrideCriteriaFn ,
464465 ) -> Result < ( SelectedServer , SelectionCriteria ) > {
465466 let criteria =
466467 criteria. unwrap_or ( & SelectionCriteria :: ReadPreference ( ReadPreference :: Primary ) ) ;
@@ -489,15 +490,14 @@ impl Client {
489490 let mut watcher = self . inner . topology . watch ( ) ;
490491 loop {
491492 let state = watcher. observe_latest ( ) ;
492- let override_criteria;
493- let effective_criteria = if let Some ( oc) =
494- Self :: override_criteria ( criteria, & state. description , is_out_or_merge)
495- {
496- override_criteria = oc;
497- & override_criteria
498- } else {
499- criteria
500- } ;
493+ let override_slot;
494+ let effective_criteria =
495+ if let Some ( oc) = override_criteria ( criteria, & state. description ) {
496+ override_slot = oc;
497+ & override_slot
498+ } else {
499+ criteria
500+ } ;
501501 let result = server_selection:: attempt_to_select_server (
502502 effective_criteria,
503503 & state. description ,
@@ -549,38 +549,6 @@ impl Client {
549549 }
550550 }
551551
552- /// Check to see if selection criteria need to be overridden. Currently only required for
553- /// aggregate operations with $merge/$out stages.
554- fn override_criteria (
555- criteria : & SelectionCriteria ,
556- desc : & crate :: sdam:: TopologyDescription ,
557- is_out_or_merge : bool ,
558- ) -> Option < SelectionCriteria > {
559- if is_out_or_merge {
560- eprintln ! ( "aggregate: checking override" ) ;
561- }
562- if !is_out_or_merge
563- || criteria == & SelectionCriteria :: ReadPreference ( ReadPreference :: Primary )
564- || desc. topology_type ( ) == crate :: TopologyType :: LoadBalanced
565- {
566- if is_out_or_merge {
567- eprintln ! ( "aggregate: skipping override" ) ;
568- }
569- return None ;
570- }
571- for server in desc. servers . values ( ) {
572- let _ = dbg ! ( server. hello_response( ) ) ;
573- if let Ok ( Some ( v) ) = server. max_wire_version ( ) {
574- static SERVER_5_0_0_WIRE_VERSION : i32 = 13 ;
575- if v < SERVER_5_0_0_WIRE_VERSION {
576- eprintln ! ( "aggregate: overriding criteria" ) ;
577- return Some ( SelectionCriteria :: ReadPreference ( ReadPreference :: Primary ) ) ;
578- }
579- }
580- }
581- return None ;
582- }
583-
584552 #[ cfg( all( test, feature = "dns-resolver" ) ) ]
585553 pub ( crate ) fn get_hosts ( & self ) -> Vec < String > {
586554 let watcher = self . inner . topology . watch ( ) ;
0 commit comments