From bdf5ac9c1abcb00a2b3fdd16a4b05c746ef31065 Mon Sep 17 00:00:00 2001 From: Tyera Eulberg Date: Fri, 17 Aug 2018 15:34:50 -0600 Subject: [PATCH] Drone: use gossip to identify leader's port config --- src/bin/drone.rs | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/src/bin/drone.rs b/src/bin/drone.rs index 4cfb284e95..7714e0ceca 100644 --- a/src/bin/drone.rs +++ b/src/bin/drone.rs @@ -8,15 +8,18 @@ extern crate tokio_codec; use bincode::deserialize; use clap::{App, Arg}; -use solana::crdt::NodeInfo; +use solana::crdt::{Crdt, NodeInfo, TestNode}; use solana::drone::{Drone, DroneRequest, DRONE_PORT}; use solana::fullnode::Config; use solana::logger; use solana::metrics::set_panic_hook; +use solana::ncp::Ncp; +use solana::service::Service; use solana::signature::read_keypair; use std::fs::File; use std::net::{IpAddr, Ipv4Addr, SocketAddr}; -use std::sync::{Arc, Mutex}; +use std::sync::atomic::{AtomicBool, Ordering}; +use std::sync::{Arc, Mutex, RwLock}; use std::thread; use tokio::net::TcpListener; use tokio::prelude::*; @@ -86,6 +89,30 @@ fn main() { request_cap = None; } + // Set up gossip functionality + let exit = Arc::new(AtomicBool::new(false)); + let testnode = TestNode::new_localhost(); + let extra_data = testnode.data.clone(); + let crdt = Arc::new(RwLock::new(Crdt::new(extra_data).expect("Crdt::new"))); + let window = Arc::new(RwLock::new(vec![])); + let ncp = Ncp::new( + &crdt.clone(), + window, + None, + testnode.sockets.gossip, + testnode.sockets.gossip_send, + exit.clone(), + ).unwrap(); + let leader_entry_point = NodeInfo::new_entry_point(leader.contact_info.ncp); + crdt.write().unwrap().insert(&leader_entry_point); + + // Block until leader's correct contact info is received + while crdt.read().unwrap().leader_data().is_none() {} + + exit.store(true, Ordering::Relaxed); + ncp.join().unwrap(); + let leader = crdt.read().unwrap().leader_data().unwrap().clone(); + let drone_addr: SocketAddr = format!("0.0.0.0:{}", DRONE_PORT).parse().unwrap(); let drone = Arc::new(Mutex::new(Drone::new(