Skip to content

Commit 0ed15e6

Browse files
author
Anton Melnikov
committed
feat(raft): better merge algorithm
1 parent bcb5da7 commit 0ed15e6

File tree

1 file changed

+10
-31
lines changed

1 file changed

+10
-31
lines changed

src/raft/bootstrap.rs

Lines changed: 10 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -148,40 +148,19 @@ impl BoostrapController {
148148
}
149149

150150
/// Merges `other` nodes list to already known. Returns new nodes count
151-
fn merge_nodes_list(&self, other: &Vec<(u64, Vec<SocketAddr>)>) -> Vec<(u64, Vec<SocketAddr>)> {
152-
let mut new_nodes = Vec::<(u64, Vec<SocketAddr>)>::with_capacity(other.len());
151+
fn merge_nodes_list(
152+
&self,
153+
nodes_from: &Vec<(u64, Vec<SocketAddr>)>,
154+
) -> Vec<(u64, Vec<SocketAddr>)> {
155+
let mut new_nodes = Vec::<(u64, Vec<SocketAddr>)>::with_capacity(nodes_from.len());
153156
{
154-
let self_nodes = self.peers.borrow();
155-
// a - already known nodes
156-
// b - received from peer nodes list
157-
let mut a_iter = self_nodes.iter();
158-
let mut b_iter = other.into_iter();
159-
let mut a = a_iter.next();
160-
let mut b = b_iter.next();
161-
162-
while let (Some((a_id, _)), Some((b_id, b_addr))) = (a, b) {
163-
let a_id = *a_id;
164-
let b_id = *b_id;
165-
if b_id < a_id {
166-
new_nodes.push((b_id, b_addr.clone()));
167-
b = b_iter.next();
168-
} else if b_id > a_id {
169-
a = a_iter.next();
170-
} else {
171-
a = a_iter.next();
172-
b = b_iter.next();
157+
let mut nodes_into = self.peers.borrow_mut();
158+
for (id, addrs) in nodes_from.into_iter() {
159+
if !nodes_into.contains_key(id) {
160+
nodes_into.insert(*id, addrs.clone());
161+
new_nodes.push((*id, addrs.clone()));
173162
}
174163
}
175-
176-
while let Some((id, addr)) = b {
177-
new_nodes.push((*id, addr.clone()));
178-
b = b_iter.next();
179-
}
180-
}
181-
182-
let mut known_nodes = self.peers.borrow_mut();
183-
for (id, addr) in new_nodes.iter() {
184-
known_nodes.insert(*id, addr.clone());
185164
}
186165
new_nodes
187166
}

0 commit comments

Comments
 (0)