@@ -56,24 +56,27 @@ const DRIVER_VERSION: &str = env!("CARGO_PKG_VERSION");
5656pub ( crate ) struct LoadBalancingConfig {
5757 pub ( crate ) token_awareness_enabled : bool ,
5858 pub ( crate ) token_aware_shuffling_replicas_enabled : bool ,
59- pub ( crate ) dc_awareness : Option < DcAwareness > ,
59+ pub ( crate ) load_balancing_kind : Option < LoadBalancingKind > ,
6060 pub ( crate ) latency_awareness_enabled : bool ,
6161 pub ( crate ) latency_awareness_builder : LatencyAwarenessBuilder ,
6262}
6363impl LoadBalancingConfig {
6464 // This is `async` to prevent running this function from beyond tokio context,
6565 // as it results in panic due to DefaultPolicyBuilder::build() spawning a tokio task.
6666 pub ( crate ) async fn build ( self ) -> Arc < dyn LoadBalancingPolicy > {
67+ let load_balancing_kind = self
68+ . load_balancing_kind
69+ // Round robin is chosen by default for cluster wide LBP.
70+ . unwrap_or ( LoadBalancingKind :: RoundRobin ) ;
71+
6772 let mut builder = DefaultPolicyBuilder :: new ( ) . token_aware ( self . token_awareness_enabled ) ;
6873 if self . token_awareness_enabled {
6974 // Cpp-driver enables shuffling replicas only if token aware routing is enabled.
7075 builder =
7176 builder. enable_shuffling_replicas ( self . token_aware_shuffling_replicas_enabled ) ;
7277 }
73- if let Some ( dc_awareness) = self . dc_awareness . as_ref ( ) {
74- builder = builder
75- . prefer_datacenter ( dc_awareness. local_dc . clone ( ) )
76- . permit_dc_failover ( true )
78+ if let LoadBalancingKind :: DcAware { local_dc } = load_balancing_kind {
79+ builder = builder. prefer_datacenter ( local_dc) . permit_dc_failover ( true )
7780 }
7881 if self . latency_awareness_enabled {
7982 builder = builder. latency_awareness ( self . latency_awareness_builder ) ;
@@ -86,16 +89,17 @@ impl Default for LoadBalancingConfig {
8689 Self {
8790 token_awareness_enabled : true ,
8891 token_aware_shuffling_replicas_enabled : true ,
89- dc_awareness : None ,
92+ load_balancing_kind : None ,
9093 latency_awareness_enabled : false ,
9194 latency_awareness_builder : Default :: default ( ) ,
9295 }
9396 }
9497}
9598
9699#[ derive( Clone , Debug ) ]
97- pub ( crate ) struct DcAwareness {
98- pub ( crate ) local_dc : String ,
100+ pub ( crate ) enum LoadBalancingKind {
101+ RoundRobin ,
102+ DcAware { local_dc : String } ,
99103}
100104
101105#[ derive( Clone ) ]
@@ -486,7 +490,7 @@ pub unsafe extern "C" fn cass_cluster_set_credentials_n(
486490#[ no_mangle]
487491pub unsafe extern "C" fn cass_cluster_set_load_balance_round_robin ( cluster_raw : * mut CassCluster ) {
488492 let cluster = ptr_to_ref_mut ( cluster_raw) ;
489- cluster. load_balancing_config . dc_awareness = None ;
493+ cluster. load_balancing_config . load_balancing_kind = Some ( LoadBalancingKind :: RoundRobin ) ;
490494}
491495
492496#[ no_mangle]
@@ -525,7 +529,7 @@ pub(crate) unsafe fn set_load_balance_dc_aware_n(
525529 . unwrap ( )
526530 . to_string ( ) ;
527531
528- load_balancing_config. dc_awareness = Some ( DcAwareness { local_dc } ) ;
532+ load_balancing_config. load_balancing_kind = Some ( LoadBalancingKind :: DcAware { local_dc } ) ;
529533
530534 CassError :: CASS_OK
531535}
@@ -880,7 +884,7 @@ mod tests {
880884 /* Test valid configurations */
881885 let cluster = ptr_to_ref ( cluster_raw) ;
882886 {
883- assert_matches ! ( cluster. load_balancing_config. dc_awareness , None ) ;
887+ assert_matches ! ( cluster. load_balancing_config. load_balancing_kind , None ) ;
884888 assert ! ( cluster. load_balancing_config. token_awareness_enabled) ;
885889 assert ! ( !cluster. load_balancing_config. latency_awareness_enabled) ;
886890 }
@@ -907,8 +911,13 @@ mod tests {
907911 40 ,
908912 ) ;
909913
910- let dc_awareness = cluster. load_balancing_config . dc_awareness . as_ref ( ) . unwrap ( ) ;
911- assert_eq ! ( dc_awareness. local_dc, "eu" ) ;
914+ let load_balancing_kind = & cluster. load_balancing_config . load_balancing_kind ;
915+ match load_balancing_kind {
916+ Some ( LoadBalancingKind :: DcAware { local_dc } ) => {
917+ assert_eq ! ( local_dc, "eu" )
918+ }
919+ _ => panic ! ( "Expected preferred dc" ) ,
920+ }
912921 assert ! ( !cluster. load_balancing_config. token_awareness_enabled) ;
913922 assert ! ( cluster. load_balancing_config. latency_awareness_enabled) ;
914923 }
0 commit comments