Fix bin_values change handling in agreement.

* Call `on_bin_values_changed` even if there is only one value.
* Handle the case _f = 0_ correctly: `count_bval` can be equal to both
  _f + 1_ and _2 f + 1_.
This commit is contained in:
Andreas Fackler 2018-07-26 09:34:34 +02:00
parent 27898168e2
commit 4bff2849f9
1 changed files with 11 additions and 9 deletions

View File

@ -314,6 +314,8 @@ impl<NodeUid: Clone + Debug + Ord> Agreement<NodeUid> {
.filter(|values| values.contains(&b))
.count();
let mut step = Step::default();
// upon receiving `BVal(b)` messages from 2f + 1 nodes,
// bin_values := bin_values {b}
if count_bval == 2 * self.netinfo.num_faulty() + 1 {
@ -324,19 +326,19 @@ impl<NodeUid: Clone + Debug + Ord> Agreement<NodeUid> {
// where w ∈ bin_values
if previous_bin_values == BinValues::None {
// Send an `Aux` message at most once per epoch.
self.send_aux(b)
} else if bin_values_changed {
self.on_bin_values_changed()
} else {
Ok(Step::default())
step.extend(self.send_aux(b)?);
}
} else if count_bval == self.netinfo.num_faulty() + 1 && !self.sent_bval.contains(&b) {
if bin_values_changed {
step.extend(self.on_bin_values_changed()?);
}
}
if count_bval == self.netinfo.num_faulty() + 1 && !self.sent_bval.contains(&b) {
// upon receiving `BVal(b)` messages from f + 1 nodes, if
// `BVal(b)` has not been sent, multicast `BVal(b)`
self.send_bval(b)
} else {
Ok(Step::default())
step.extend(self.send_bval(b)?);
}
Ok(step)
}
/// Called when `bin_values` changes as a result of receiving a `BVal` message. Tries to update