From 4bff2849f92492fbd69a5c1f0ba131e2e759774b Mon Sep 17 00:00:00 2001 From: Andreas Fackler Date: Thu, 26 Jul 2018 09:34:34 +0200 Subject: [PATCH] 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_. --- src/agreement/mod.rs | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/agreement/mod.rs b/src/agreement/mod.rs index f7a04b7..e0e7705 100644 --- a/src/agreement/mod.rs +++ b/src/agreement/mod.rs @@ -314,6 +314,8 @@ impl Agreement { .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 Agreement { // 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