Improve gossip use for drone and wallet
- Add utility function - Add thread sleep - Enable configurable timeout for gossip poll
This commit is contained in:
committed by
Tyera Eulberg
parent
4fdd9fbfca
commit
d4c41219f9
@@ -5,12 +5,17 @@
|
||||
|
||||
use bank::Account;
|
||||
use bincode::{deserialize, serialize};
|
||||
use crdt::{Crdt, CrdtError, NodeInfo, TestNode};
|
||||
use hash::Hash;
|
||||
use ncp::Ncp;
|
||||
use request::{Request, Response};
|
||||
use result::{Error, Result};
|
||||
use signature::{Keypair, Pubkey, Signature};
|
||||
use std::collections::HashMap;
|
||||
use std::io;
|
||||
use std::net::{SocketAddr, UdpSocket};
|
||||
use std::sync::atomic::AtomicBool;
|
||||
use std::sync::{Arc, RwLock};
|
||||
use std::thread::sleep;
|
||||
use std::time::Duration;
|
||||
use std::time::Instant;
|
||||
@@ -320,6 +325,38 @@ impl Drop for ThinClient {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn poll_gossip_for_leader(leader_ncp: SocketAddr, timeout: Option<u64>) -> Result<NodeInfo> {
|
||||
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_ncp);
|
||||
crdt.write().unwrap().insert(&leader_entry_point);
|
||||
|
||||
sleep(Duration::from_millis(100));
|
||||
|
||||
let now = Instant::now();
|
||||
// Block until leader's correct contact info is received
|
||||
while crdt.read().unwrap().leader_data().is_none() {
|
||||
if timeout.is_some() && now.elapsed() > Duration::new(timeout.unwrap(), 0) {
|
||||
return Err(Error::CrdtError(CrdtError::NoLeader));
|
||||
}
|
||||
}
|
||||
|
||||
ncp.close()?;
|
||||
let leader = crdt.read().unwrap().leader_data().unwrap().clone();
|
||||
Ok(leader)
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
Reference in New Issue
Block a user