@@ -56,24 +56,27 @@ const DRIVER_VERSION: &str = env!("CARGO_PKG_VERSION");
56
56
pub ( crate ) struct LoadBalancingConfig {
57
57
pub ( crate ) token_awareness_enabled : bool ,
58
58
pub ( crate ) token_aware_shuffling_replicas_enabled : bool ,
59
- pub ( crate ) dc_awareness : Option < DcAwareness > ,
59
+ pub ( crate ) load_balancing_kind : Option < LoadBalancingKind > ,
60
60
pub ( crate ) latency_awareness_enabled : bool ,
61
61
pub ( crate ) latency_awareness_builder : LatencyAwarenessBuilder ,
62
62
}
63
63
impl LoadBalancingConfig {
64
64
// This is `async` to prevent running this function from beyond tokio context,
65
65
// as it results in panic due to DefaultPolicyBuilder::build() spawning a tokio task.
66
66
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
+
67
72
let mut builder = DefaultPolicyBuilder :: new ( ) . token_aware ( self . token_awareness_enabled ) ;
68
73
if self . token_awareness_enabled {
69
74
// Cpp-driver enables shuffling replicas only if token aware routing is enabled.
70
75
builder =
71
76
builder. enable_shuffling_replicas ( self . token_aware_shuffling_replicas_enabled ) ;
72
77
}
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 )
77
80
}
78
81
if self . latency_awareness_enabled {
79
82
builder = builder. latency_awareness ( self . latency_awareness_builder ) ;
@@ -86,16 +89,17 @@ impl Default for LoadBalancingConfig {
86
89
Self {
87
90
token_awareness_enabled : true ,
88
91
token_aware_shuffling_replicas_enabled : true ,
89
- dc_awareness : None ,
92
+ load_balancing_kind : None ,
90
93
latency_awareness_enabled : false ,
91
94
latency_awareness_builder : Default :: default ( ) ,
92
95
}
93
96
}
94
97
}
95
98
96
99
#[ 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 } ,
99
103
}
100
104
101
105
#[ derive( Clone ) ]
@@ -486,7 +490,7 @@ pub unsafe extern "C" fn cass_cluster_set_credentials_n(
486
490
#[ no_mangle]
487
491
pub unsafe extern "C" fn cass_cluster_set_load_balance_round_robin ( cluster_raw : * mut CassCluster ) {
488
492
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 ) ;
490
494
}
491
495
492
496
#[ no_mangle]
@@ -525,7 +529,7 @@ pub(crate) unsafe fn set_load_balance_dc_aware_n(
525
529
. unwrap ( )
526
530
. to_string ( ) ;
527
531
528
- load_balancing_config. dc_awareness = Some ( DcAwareness { local_dc } ) ;
532
+ load_balancing_config. load_balancing_kind = Some ( LoadBalancingKind :: DcAware { local_dc } ) ;
529
533
530
534
CassError :: CASS_OK
531
535
}
@@ -880,7 +884,7 @@ mod tests {
880
884
/* Test valid configurations */
881
885
let cluster = ptr_to_ref ( cluster_raw) ;
882
886
{
883
- assert_matches ! ( cluster. load_balancing_config. dc_awareness , None ) ;
887
+ assert_matches ! ( cluster. load_balancing_config. load_balancing_kind , None ) ;
884
888
assert ! ( cluster. load_balancing_config. token_awareness_enabled) ;
885
889
assert ! ( !cluster. load_balancing_config. latency_awareness_enabled) ;
886
890
}
@@ -907,8 +911,13 @@ mod tests {
907
911
40 ,
908
912
) ;
909
913
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
+ }
912
921
assert ! ( !cluster. load_balancing_config. token_awareness_enabled) ;
913
922
assert ! ( cluster. load_balancing_config. latency_awareness_enabled) ;
914
923
}
0 commit comments