Merge pull request #394 from poanetwork/afck-qhb-duplicate-aux

Fix BA message handling on epoch change.
This commit is contained in:
Vladimir Komendantskiy 2019-04-02 13:57:17 +01:00 committed by GitHub
commit a64f62506d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 12 additions and 15 deletions

View File

@ -258,9 +258,11 @@ impl<N: NodeIdT, S: SessionIdT> BinaryAgreement<N, S> {
let received = epoch_state let received = epoch_state
.entry(sender_id.clone()) .entry(sender_id.clone())
.or_insert_with(ReceivedMessages::new); .or_insert_with(ReceivedMessages::new);
Ok(received.insert(content).map_or(Step::default(), |fault| { Ok(received
Fault::new(sender_id.clone(), fault).into() .insert(content)
})) .map_or_else(Step::default, |fault| {
Fault::new(sender_id.clone(), fault).into()
}))
} else { } else {
self.handle_message_content(sender_id, content) self.handle_message_content(sender_id, content)
} }
@ -504,15 +506,12 @@ impl<N: NodeIdT, S: SessionIdT> BinaryAgreement<N, S> {
self.estimated = Some(b); self.estimated = Some(b);
let sbvb_step = self.sbv_broadcast.send_bval(b)?; let sbvb_step = self.sbv_broadcast.send_bval(b)?;
let mut step = self.handle_sbvb_step(sbvb_step)?; let mut step = self.handle_sbvb_step(sbvb_step)?;
let epoch_state = self let epoch = self.epoch;
.incoming_queue let epoch_state = self.incoming_queue.remove(&epoch).into_iter().flatten();
.remove(&self.epoch)
.into_iter()
.flatten();
for (sender_id, received) in epoch_state { for (sender_id, received) in epoch_state {
for m in received.messages() { for m in received.messages() {
step.extend(self.handle_message_content(&sender_id, m)?); step.extend(self.handle_message_content(&sender_id, m)?);
if self.decision.is_some() { if self.decision.is_some() || self.epoch > epoch {
return Ok(step); return Ok(step);
} }
} }

View File

@ -112,12 +112,10 @@ impl<N: NodeIdT> SbvBroadcast<N> {
/// Upon receiving _f + 1_ `BVal(b)`, multicasts `BVal(b)`. Upon receiving _2 f + 1_ `BVal(b)`, /// Upon receiving _f + 1_ `BVal(b)`, multicasts `BVal(b)`. Upon receiving _2 f + 1_ `BVal(b)`,
/// updates `bin_values`. When `bin_values` gets its first entry, multicasts `Aux(b)`. /// updates `bin_values`. When `bin_values` gets its first entry, multicasts `Aux(b)`.
pub fn handle_bval(&mut self, sender_id: &N, b: bool) -> Result<Step<N>> { pub fn handle_bval(&mut self, sender_id: &N, b: bool) -> Result<Step<N>> {
let count_bval = { if !self.received_bval[b].insert(sender_id.clone()) {
if !self.received_bval[b].insert(sender_id.clone()) { return Ok(Fault::new(sender_id.clone(), FaultKind::DuplicateBVal).into());
return Ok(Fault::new(sender_id.clone(), FaultKind::DuplicateBVal).into()); }
} let count_bval = self.received_bval[b].len();
self.received_bval[b].len()
};
let mut step = Step::default(); let mut step = Step::default();