Skip to content

Commit d598545

Browse files
committed
Fix server ordering to ensure consistent load balancer outcome
1 parent f290c8d commit d598545

File tree

2 files changed

+20
-3
lines changed

2 files changed

+20
-3
lines changed

lib/src/routing/connection_registry.rs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,8 @@ impl ConnectionRegistry {
306306
.map(|entry| entry.value().clone())
307307
.unwrap_or_default()
308308
} else {
309+
debug!("Creating new registry for database: {}", db_name);
310+
self.databases.insert(db_name.clone(), Vec::new());
309311
vec![]
310312
}
311313
}
@@ -499,6 +501,16 @@ mod tests {
499501
addresses: vec!["host0:7687".to_string()],
500502
role: "ROUTE".to_string(),
501503
}];
504+
let cluster_routing_table_default = RoutingTable {
505+
ttl: 300,
506+
db: Some("".into()),
507+
servers: readers1
508+
.clone()
509+
.into_iter()
510+
.chain(writers1.clone())
511+
.chain(routers.clone())
512+
.collect(),
513+
};
502514
let cluster_routing_table_1 = RoutingTable {
503515
ttl: 300,
504516
db: Some("db1".into()),
@@ -531,6 +543,7 @@ mod tests {
531543
let registry = Arc::new(ConnectionRegistry::default());
532544
// get registry for db1 amd refresh routing table
533545
let provider = Arc::new(TestRoutingTableProvider::new(&[
546+
cluster_routing_table_default,
534547
cluster_routing_table_1,
535548
cluster_routing_table_2,
536549
]));
@@ -571,7 +584,7 @@ mod tests {
571584
.unwrap();
572585
assert_eq!(
573586
format!("{}:{}", writer.address, writer.port),
574-
writers2[0].addresses[0]
587+
writers2[1].addresses[0]
575588
);
576589
}
577590
}

lib/src/routing/load_balancing/round_robin_strategy.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,14 +52,16 @@ impl LoadBalancingStrategy for RoundRobinStrategy {
5252
.filter(|s| s.role == "READ")
5353
.cloned()
5454
.collect::<Vec<BoltServer>>();
55-
let all_readers = self
55+
let mut all_readers = self
5656
.connection_registry
5757
.all_servers()
5858
.iter()
5959
.filter(|s| s.role == "READ")
6060
.cloned()
6161
.collect::<Vec<BoltServer>>();
6262

63+
// Sort all writers by address to ensure consistent ordering
64+
all_readers.sort_by(|a, b| a.address.cmp(&b.address));
6365
Self::select(&all_readers, &readers, &self.reader_index)
6466
}
6567

@@ -69,14 +71,16 @@ impl LoadBalancingStrategy for RoundRobinStrategy {
6971
.filter(|s| s.role == "WRITE")
7072
.cloned()
7173
.collect::<Vec<BoltServer>>();
72-
let all_writers = self
74+
let mut all_writers = self
7375
.connection_registry
7476
.all_servers()
7577
.iter()
7678
.filter(|s| s.role == "WRITE")
7779
.cloned()
7880
.collect::<Vec<BoltServer>>();
7981

82+
// Sort all writers by address to ensure consistent ordering
83+
all_writers.sort_by(|a, b| a.address.cmp(&b.address));
8084
Self::select(&all_writers, &writers, &self.writer_index)
8185
}
8286
}

0 commit comments

Comments
 (0)