From 47d7118f040d9fa3fb098aeb04423ff008ce3ad8 Mon Sep 17 00:00:00 2001 From: Joe Ardent Date: Wed, 17 Sep 2025 14:08:54 -0700 Subject: [PATCH] just gossip to one non-self node 2x as often, better latencies, same msgs/op --- gg-broadcast/src/main.rs | 57 ++++++++++++++++------------------------ 1 file changed, 22 insertions(+), 35 deletions(-) diff --git a/gg-broadcast/src/main.rs b/gg-broadcast/src/main.rs index 3e25ab2..de48b16 100644 --- a/gg-broadcast/src/main.rs +++ b/gg-broadcast/src/main.rs @@ -18,7 +18,7 @@ fn main() { fn on_init(runner: &Runner) { let tx = runner.get_backdoor(); thread::spawn(move || loop { - let millis = 50; + let millis = 25; thread::sleep(Duration::from_millis(millis)); let body = Body::from_type("do_gossip"); let msg = Message { @@ -33,45 +33,30 @@ fn on_init(runner: &Runner) { struct BCaster { store: BTreeSet, gossips: HashMap>, - neighbors: Vec, - others: Vec, + nodes: Vec, } impl BCaster { - fn topology(&mut self, topology: HashMap>, id: &str) { - self.neighbors = topology[id].clone(); - self.neighbors.sort_unstable(); - for node in topology.keys() { - if !(node == id || self.neighbors.binary_search(node).is_ok()) { - self.others.push(node.to_owned()); - } - } - } - fn gossip(&self, runner: &Runner) { - let mut rng = rand::thread_rng(); - let neighbor = &self.neighbors[rng.gen_range(0..self.neighbors.len())]; - let goss = if let Some(ngoss) = self.gossips.get(neighbor) { - self.store.difference(ngoss).copied().collect() - } else { - self.store.clone() - }; - let goss: Vec<_> = goss.into_iter().collect(); - let payload: Payload = [("goss".to_string(), goss.into())].into_iter().collect(); - let body = Body::from_type("gossip").with_payload(payload); - runner.send(neighbor, body); + if self.nodes.is_empty() { + return; + } - // now the non-neighbor - let other = &self.others[rng.gen_range(0..self.others.len())]; - let goss = if let Some(goss) = self.gossips.get(other) { + let mut rng = rand::thread_rng(); + let dest = &self.nodes[rng.gen_range(0..self.nodes.len())]; + let goss = if let Some(goss) = self.gossips.get(dest) { self.store.difference(goss).copied().collect() } else { self.store.clone() }; - 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_iter().collect::>().into(), + )] + .into_iter() + .collect(); let body = Body::from_type("gossip").with_payload(payload); - runner.send(other, body); + runner.send(dest, body); } } @@ -103,11 +88,13 @@ impl Node for BCaster { runner.reply(&req, body); } "topology" => { - let nid = runner.node_id(); - let topology = - serde_json::from_value(req.body.payload.get("topology").cloned().unwrap()) - .unwrap(); - self.topology(topology, nid); + let nodes = runner + .nodes() + .iter() + .filter(|&n| n.as_str() != runner.node_id()) + .cloned() + .collect(); + self.nodes = nodes; let body = Body::from_type("topology_ok"); runner.reply(&req, body); }