@@ -21,6 +21,7 @@ use tracing::warn;
2121/// Latency awareness is available, although not recommended.
2222pub struct DefaultPolicy {
2323 preferred_datacenter : Option < String > ,
24+ preferred_rack : Option < String > ,
2425 is_token_aware : bool ,
2526 permit_dc_failover : bool ,
2627 pick_predicate : Box < dyn Fn ( & NodeRef ) -> bool + Send + Sync > ,
@@ -32,6 +33,7 @@ impl fmt::Debug for DefaultPolicy {
3233 fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
3334 f. debug_struct ( "DefaultPolicy" )
3435 . field ( "preferred_datacenter" , & self . preferred_datacenter )
36+ . field ( "preferred_rack" , & self . preferred_rack )
3537 . field ( "is_token_aware" , & self . is_token_aware )
3638 . field ( "permit_dc_failover" , & self . permit_dc_failover )
3739 . field ( "latency_awareness" , & self . latency_awareness )
@@ -364,6 +366,7 @@ impl Default for DefaultPolicy {
364366 fn default ( ) -> Self {
365367 Self {
366368 preferred_datacenter : None ,
369+ preferred_rack : None ,
367370 is_token_aware : true ,
368371 permit_dc_failover : false ,
369372 pick_predicate : Box :: new ( Self :: is_alive) ,
@@ -390,6 +393,7 @@ impl Default for DefaultPolicy {
390393#[ derive( Clone , Debug ) ]
391394pub struct DefaultPolicyBuilder {
392395 preferred_datacenter : Option < String > ,
396+ preferred_rack : Option < String > ,
393397 is_token_aware : bool ,
394398 permit_dc_failover : bool ,
395399 latency_awareness : Option < LatencyAwarenessBuilder > ,
@@ -401,6 +405,7 @@ impl DefaultPolicyBuilder {
401405 pub fn new ( ) -> Self {
402406 Self {
403407 preferred_datacenter : None ,
408+ preferred_rack : None ,
404409 is_token_aware : true ,
405410 permit_dc_failover : false ,
406411 latency_awareness : None ,
@@ -421,6 +426,7 @@ impl DefaultPolicyBuilder {
421426
422427 Arc :: new ( DefaultPolicy {
423428 preferred_datacenter : self . preferred_datacenter ,
429+ preferred_rack : self . preferred_rack ,
424430 is_token_aware : self . is_token_aware ,
425431 permit_dc_failover : self . permit_dc_failover ,
426432 pick_predicate,
@@ -429,6 +435,19 @@ impl DefaultPolicyBuilder {
429435 } )
430436 }
431437
438+ /// Sets the rack to be preferred by this policy
439+ ///
440+ /// Allows the load balancing policy to prioritize nodes based on their availability zones
441+ /// in the preferred datacenter.
442+ /// When a preferred rack is set, the policy will first return replicas in the local rack
443+ /// in the preferred datacenter, and then the other replicas in the datacenter.
444+ ///
445+ /// When a preferred datacenter is not set, setting preferred rack will not have any effect.
446+ pub fn prefer_rack ( mut self , rack_name : String ) -> Self {
447+ self . preferred_rack = Some ( rack_name) ;
448+ self
449+ }
450+
432451 /// Sets the datacenter to be preferred by this policy.
433452 ///
434453 /// Allows the load balancing policy to prioritize nodes based on their location.
@@ -1786,6 +1805,7 @@ mod latency_awareness {
17861805
17871806 DefaultPolicy {
17881807 preferred_datacenter : Some ( "eu" . to_owned ( ) ) ,
1808+ preferred_rack : None ,
17891809 permit_dc_failover : true ,
17901810 is_token_aware : true ,
17911811 pick_predicate,
0 commit comments