diff --git a/core/src/gossip_service.rs b/core/src/gossip_service.rs index 06fac2f53d..a987947493 100644 --- a/core/src/gossip_service.rs +++ b/core/src/gossip_service.rs @@ -16,7 +16,6 @@ use std::thread::{self, JoinHandle}; use std::time::Duration; pub struct GossipService { - exit: Arc, thread_hdls: Vec>, } @@ -53,15 +52,7 @@ impl GossipService { exit.clone(), ); let thread_hdls = vec![t_receiver, t_responder, t_listen, t_gossip]; - Self { - exit: exit.clone(), - thread_hdls, - } - } - - pub fn close(self) -> thread::Result<()> { - self.exit.store(true, Ordering::Relaxed); - self.join() + Self { thread_hdls } } } @@ -99,8 +90,10 @@ pub fn discover(entry_point_info: &NodeInfo, num_nodes: usize) -> Vec //TODO: deprecate this in favor of discover pub fn converge(node: &NodeInfo, num_nodes: usize) -> Vec { info!("Wait for convergence with {} nodes", num_nodes); + + let exit = Arc::new(AtomicBool::new(false)); // Let's spy on the network - let (gossip_service, spy_ref, id) = make_spy_node(node); + let (gossip_service, spy_ref, id) = make_spy_node(node, &exit); trace!( "converge spy_node {} looking for at least {} nodes", id, @@ -117,7 +110,8 @@ pub fn converge(node: &NodeInfo, num_nodes: usize) -> Vec { num_nodes, rpc_peers ); - gossip_service.close().unwrap(); + exit.store(true, Ordering::Relaxed); + gossip_service.join().unwrap(); return rpc_peers; } debug!( @@ -132,9 +126,11 @@ pub fn converge(node: &NodeInfo, num_nodes: usize) -> Vec { panic!("Failed to converge"); } -pub fn make_spy_node(leader: &NodeInfo) -> (GossipService, Arc>, Pubkey) { +fn make_spy_node( + leader: &NodeInfo, + exit: &Arc, +) -> (GossipService, Arc>, Pubkey) { let keypair = Keypair::new(); - let exit = Arc::new(AtomicBool::new(false)); let mut spy = Node::new_localhost_with_pubkey(keypair.pubkey()); let id = spy.info.id; let daddr = "0.0.0.0:0".parse().unwrap(); @@ -145,7 +141,7 @@ pub fn make_spy_node(leader: &NodeInfo) -> (GossipService, Arc) - sleep(Duration::from_millis(100)); } - gossip_service.close()?; + exit.store(true, Ordering::Relaxed); + gossip_service.join()?; if log_enabled!(log::Level::Trace) { trace!("{}", cluster_info.read().unwrap().node_info_trace());