Compare commits

..

No commits in common. "19cbde32fd4ec226d8aadacb45e8b2eb8a1476fd" and "4d6df5c8a5df899b45a5a7864fa1e395c8309f68" have entirely different histories.

View file

@ -18,7 +18,7 @@ fn main() {
fn on_init(runner: &Runner) { fn on_init(runner: &Runner) {
let tx = runner.get_backdoor(); let tx = runner.get_backdoor();
thread::spawn(move || loop { thread::spawn(move || loop {
let millis = rand::thread_rng().gen_range(50..=60); let millis = rand::thread_rng().gen_range(400..=800);
thread::sleep(Duration::from_millis(millis)); thread::sleep(Duration::from_millis(millis));
let body = Body::from_type("do_gossip"); let body = Body::from_type("do_gossip");
let msg = Message { let msg = Message {
@ -33,19 +33,35 @@ fn on_init(runner: &Runner) {
struct BCaster { struct BCaster {
store: HashSet<i64>, store: HashSet<i64>,
gossips: HashMap<String, HashSet<i64>>, gossips: HashMap<String, HashSet<i64>>,
neighbors: Vec<String>, neighbors: HashSet<String>,
others: Vec<String>,
} }
const NUM_NEIGHBORS: i32 = 5;
impl BCaster { impl BCaster {
fn topology(&mut self, topology: HashMap<&str, Vec<String>>, id: &str) { fn topology(&mut self, nodes: &[String], id: &str) {
self.neighbors = topology[id].clone(); let mut nodes = nodes.to_vec();
self.neighbors.sort_unstable(); let len = nodes.len();
for &node in topology.keys() { nodes.sort_unstable();
let node = node.to_string(); let idx = nodes
if !(node == id || self.neighbors.binary_search(&node).is_ok()) { .iter()
self.others.push(node); .enumerate()
} .find(|n| n.1.as_str() == id)
.unwrap()
.0;
for i in 1..=NUM_NEIGHBORS {
let ni = idx as i32 - i;
let left = if ni < 0 {
let ni = -ni;
let ni = ni as usize % len;
len - ni
} else {
ni as usize
};
let right = (idx + i as usize) % len;
self.neighbors.insert(nodes[left].clone());
self.neighbors.insert(nodes[right].clone());
} }
} }
@ -58,22 +74,16 @@ impl BCaster {
} else { } else {
self.store.clone() self.store.clone()
}; };
for v in self.store.iter().filter(|_| rng.gen_bool(0.10)) { for v in self.store.iter().filter(|_| rng.gen_bool(0.11)) {
goss.insert(*v); goss.insert(*v);
} }
if !goss.is_empty() && rng.gen_bool(0.6) { if !goss.is_empty() {
let goss: Vec<_> = goss.into_iter().collect(); let goss: Vec<_> = goss.into_iter().collect();
let payload: Payload = [("goss".to_string(), goss.into())].into_iter().collect(); let payload: Payload = [("goss".to_string(), goss.into())].into_iter().collect();
let body = Body::from_type("gossip").with_payload(payload); let body = Body::from_type("gossip").with_payload(payload);
runner.send(node, body.clone()); runner.send(node, body);
} }
} }
let other = &self.others[rng.gen_range(0..self.others.len())];
let goss: Vec<_> = self.store.iter().cloned().collect();
let payload: Payload = [("goss".to_string(), goss.into())].into_iter().collect();
let body = Body::from_type("gossip").with_payload(payload);
runner.send(other, body);
} }
} }
@ -104,27 +114,7 @@ impl Node for BCaster {
} }
"topology" => { "topology" => {
let nid = runner.node_id(); let nid = runner.node_id();
let topology = req self.topology(runner.nodes(), nid);
.body
.payload
.get("topology")
.unwrap()
.as_object()
.unwrap();
let topology: HashMap<&str, Vec<String>> = topology
.iter()
.map(|(k, v)| {
(
k.as_str(),
v.as_array()
.unwrap()
.iter()
.map(|v| v.as_str().unwrap().to_string())
.collect(),
)
})
.collect();
self.topology(topology, nid);
let body = Body::from_type("topology_ok"); let body = Body::from_type("topology_ok");
runner.reply(&req, body); runner.reply(&req, body);
} }