forked from Deuxfleurs/garage
Ensure .sort() is called before counting unique items
This commit is contained in:
parent
ea5afc2511
commit
fd5bc142b5
1 changed files with 14 additions and 16 deletions
|
@ -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
|
||||||
self.get_node_zone(&self.node_id_vec[*n as usize])
|
.iter()
|
||||||
.expect("Zone not found.")
|
.map(|n| {
|
||||||
});
|
self.get_node_zone(&self.node_id_vec[*n as usize])
|
||||||
|
.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
|
||||||
|
|
Loading…
Reference in a new issue