Ensure .sort() is called before counting unique items

This commit is contained in:
Alex Auvolat 2022-11-07 20:29:25 +01:00
parent ea5afc2511
commit fd5bc142b5
No known key found for this signature in database
GPG key ID: 0E496D15096376BE

View file

@ -355,17 +355,22 @@ To know the correct value of the new layout version, invoke `garage layout show`
// Check that every partition is associated to distinct nodes // Check that every partition is associated to distinct nodes
let rf = self.replication_factor; let rf = self.replication_factor;
for p in 0..(1 << PARTITION_BITS) { for p in 0..(1 << PARTITION_BITS) {
let nodes_of_p = self.ring_assignation_data[rf * p..rf * (p + 1)].to_vec(); let mut nodes_of_p = self.ring_assignation_data[rf * p..rf * (p + 1)].to_vec();
nodes_of_p.sort();
if nodes_of_p.iter().unique().count() != rf { if nodes_of_p.iter().unique().count() != rf {
return false; return false;
} }
// Check that every partition is spread over at least zone_redundancy zones. // Check that every partition is spread over at least zone_redundancy zones.
let zones_of_p = nodes_of_p.iter().map(|n| { let mut zones_of_p = nodes_of_p
.iter()
.map(|n| {
self.get_node_zone(&self.node_id_vec[*n as usize]) self.get_node_zone(&self.node_id_vec[*n as usize])
.expect("Zone not found.") .expect("Zone not found.")
}); })
.collect::<Vec<_>>();
zones_of_p.sort();
let redundancy = self.parameters.zone_redundancy; let redundancy = self.parameters.zone_redundancy;
if zones_of_p.unique().count() < redundancy { if zones_of_p.iter().unique().count() < redundancy {
return false; return false;
} }
} }
@ -378,9 +383,7 @@ To know the correct value of the new layout version, invoke `garage layout show`
for (n, usage) in node_usage.iter().enumerate() { for (n, usage) in node_usage.iter().enumerate() {
if *usage > 0 { if *usage > 0 {
let uuid = self.node_id_vec[n]; let uuid = self.node_id_vec[n];
if usage * self.partition_size if usage * self.partition_size > self.get_node_capacity(&uuid).unwrap() {
> self.get_node_capacity(&uuid).expect("Critical Error")
{
return false; return false;
} }
} }
@ -389,7 +392,7 @@ To know the correct value of the new layout version, invoke `garage layout show`
// Check that the partition size stored is the one computed by the asignation // Check that the partition size stored is the one computed by the asignation
// algorithm. // algorithm.
let cl2 = self.clone(); let cl2 = self.clone();
let (_, zone_to_id) = cl2.generate_nongateway_zone_ids().expect("Critical Error"); let (_, zone_to_id) = cl2.generate_nongateway_zone_ids().unwrap();
match cl2.compute_optimal_partition_size(&zone_to_id) { match cl2.compute_optimal_partition_size(&zone_to_id) {
Ok(s) if s != self.partition_size => return false, Ok(s) if s != self.partition_size => return false,
Err(_) => return false, Err(_) => return false,
@ -484,12 +487,7 @@ impl ClusterLayout {
} }
// We display statistics of the computation // We display statistics of the computation
msg.append(&mut self.output_stat( msg.extend(self.output_stat(&gflow, &old_assignation_opt, &zone_to_id, &id_to_zone)?);
&gflow,
&old_assignation_opt,
&zone_to_id,
&id_to_zone,
)?);
msg.push("".to_string()); msg.push("".to_string());
// We update the layout structure // We update the layout structure