From 0b47404ba6f6fcc8e112f82046688f227e175aff Mon Sep 17 00:00:00 2001 From: sakridge Date: Fri, 27 Jul 2018 15:53:31 -0700 Subject: [PATCH] Check for default leader and use cmp::max for a bit nicer code (#779) --- src/crdt.rs | 27 ++++++++++++++++++++++++++- tests/multinode.rs | 5 ++--- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/crdt.rs b/src/crdt.rs index 3369a0816..5e714f805 100644 --- a/src/crdt.rs +++ b/src/crdt.rs @@ -328,7 +328,14 @@ impl Crdt { &self.table[&self.me] } pub fn leader_data(&self) -> Option<&NodeInfo> { - self.table.get(&(self.table[&self.me].leader_id)) + let leader_id = self.table[&self.me].leader_id; + + // leader_id can be 0s from network entry point + if leader_id == PublicKey::default() { + return None; + } + + self.table.get(&leader_id) } pub fn set_leader(&mut self, key: PublicKey) -> () { @@ -1817,6 +1824,7 @@ mod tests { crdt.purge(now + GOSSIP_PURGE_MILLIS + 1); assert_eq!(len as usize - 1, crdt.table.len()); assert_eq!(crdt.my_data().leader_id, PublicKey::default()); + assert!(crdt.leader_data().is_none()); } /// test window requests respond with the right blob, and do not overrun @@ -1956,4 +1964,21 @@ mod tests { let bad_address_multicast = "224.254.0.0:1234".parse().unwrap(); assert!(!Crdt::is_valid_address(bad_address_multicast)); } + + #[test] + fn test_default_leader() { + logger::setup(); + let node_info = NodeInfo::new( + KeyPair::new().pubkey(), + "127.0.0.1:1234".parse().unwrap(), + "127.0.0.1:1235".parse().unwrap(), + "127.0.0.1:1236".parse().unwrap(), + "127.0.0.1:1237".parse().unwrap(), + "127.0.0.1:1238".parse().unwrap(), + ); + let mut crdt = Crdt::new(node_info).unwrap(); + let network_entry_point = NodeInfo::new_entry_point("127.0.0.1:1239".parse().unwrap()); + crdt.insert(&network_entry_point); + assert!(crdt.leader_data().is_none()); + } } diff --git a/tests/multinode.rs b/tests/multinode.rs index aa524e2b2..a4f9928d2 100755 --- a/tests/multinode.rs +++ b/tests/multinode.rs @@ -16,6 +16,7 @@ use solana::signature::{KeyPair, KeyPairUtil, PublicKey}; use solana::streamer::default_window; use solana::thin_client::ThinClient; use solana::timing::duration_as_s; +use std::cmp::max; use std::env; use std::fs::File; use std::net::UdpSocket; @@ -503,9 +504,7 @@ fn test_multi_node_dynamic_network() { ); let bal = getbal.unwrap_or(0); let distance = (leader_balance - bal) / 500; - if distance > max_distance { - max_distance = distance; - } + max_distance = max(distance, max_distance); total_distance += distance; if let Some(bal) = getbal { if bal == leader_balance {