broadcast instance now counts all Ready messages and doesn't derive node's hash from them

This commit is contained in:
Vladimir Komendantskiy 2018-04-06 18:42:04 +01:00
parent 99ff3c4863
commit f620c7b000
1 changed files with 12 additions and 20 deletions

View File

@ -1,4 +1,5 @@
//! Reliable broadcast algorithm instance.
use std::collections::HashMap;
use std::fmt::Debug;
use std::hash::Hash;
use std::sync::{Arc, Mutex};
@ -221,9 +222,10 @@ where T: Clone + Debug + Eq + Hash + Send + Sync + Into<Vec<u8>>
// Assemble a Merkle tree from data and parity shards. Take all proofs from
// this tree and send them, each to its own node.
if let Some(v) = broadcast_value {
match send_shards(v, tx, &coding) {
// Record the first proof as if it were sent by the node to itself.
Ok(proof) => {
send_shards(v, tx, &coding)
.map(|proof| {
// Record the first proof as if it were sent by the node to
// itself.
let h = proof.root_hash.clone();
if proof.validate(h.as_slice()) {
// Save the leaf value for reconstructing the tree later.
@ -231,12 +233,9 @@ where T: Clone + Debug + Eq + Hash + Send + Sync + Into<Vec<u8>>
Some(Vec::from(proof.value.clone())
.into_boxed_slice());
leaf_values_num = leaf_values_num + 1;
//
root_hash = Some(h);
}
},
Err(e) => return Err(e)
}
})?
}
// return value
@ -244,7 +243,7 @@ where T: Clone + Debug + Eq + Hash + Send + Sync + Into<Vec<u8>>
// Number of times Echo was received with the same root hash.
let mut echo_num = 0;
// Number of times Ready was received with the same root hash.
let mut ready_num = 0;
let mut readys: HashMap<Vec<u8>, usize> = HashMap::new();
let mut ready_sent = false;
let mut ready_to_decode = false;
@ -343,20 +342,13 @@ where T: Clone + Debug + Eq + Hash + Send + Sync + Into<Vec<u8>>
}
},
BroadcastMessage::Ready(ref h) => {
// TODO: Prioritise the Value root hash, possibly. Prevent
// an incorrect node from blocking progress which it could
// achieve by sending an incorrect hash.
if let None = root_hash {
if i == node_index {
root_hash = Some(h.clone());
debug!("Node {} Ready root hash {:?}",
node_index, root_hash);
}
}
BroadcastMessage::Ready(ref hash) => {
// Update the number Ready has been received with this hash.
*readys.entry(hash.to_vec()).or_insert(1) += 1;
// Check that the root hash matches.
if let &Some(ref h) = &root_hash {
ready_num += 1;
let ready_num: usize = *readys.get(h).unwrap_or(&0);
// Upon receiving f + 1 matching Ready(h) messages, if
// Ready has not yet been sent, multicast Ready(h).