Fix stake pruning test (#5124)

This commit is contained in:
Justin Starry
2019-07-16 13:20:03 -04:00
committed by GitHub
parent 77ea8b9b3e
commit bf5bce50a4
2 changed files with 36 additions and 31 deletions

View File

@ -72,7 +72,7 @@ impl CrdsGossipPush {
fn prune_stake_threshold(self_stake: u64, origin_stake: u64) -> u64 { fn prune_stake_threshold(self_stake: u64, origin_stake: u64) -> u64 {
let min_path_stake = self_stake.min(origin_stake); let min_path_stake = self_stake.min(origin_stake);
(CRDS_GOSSIP_PRUNE_STAKE_THRESHOLD_PCT * min_path_stake as f64).round() as u64 ((CRDS_GOSSIP_PRUNE_STAKE_THRESHOLD_PCT * min_path_stake as f64).round() as u64).max(1)
} }
pub fn prune_received_cache( pub fn prune_received_cache(

View File

@ -10,7 +10,7 @@ use solana::crds_value::CrdsValueLabel;
use solana_sdk::hash::hash; use solana_sdk::hash::hash;
use solana_sdk::pubkey::Pubkey; use solana_sdk::pubkey::Pubkey;
use solana_sdk::timing::timestamp; use solana_sdk::timing::timestamp;
use std::collections::HashMap; use std::collections::{HashMap, HashSet};
use std::ops::Deref; use std::ops::Deref;
use std::sync::{Arc, Mutex}; use std::sync::{Arc, Mutex};
@ -40,15 +40,15 @@ impl Deref for Node {
struct Network { struct Network {
nodes: HashMap<Pubkey, Node>, nodes: HashMap<Pubkey, Node>,
pruned_count: usize,
stake_pruned: u64, stake_pruned: u64,
connections_pruned: HashSet<(Pubkey, Pubkey)>,
} }
impl Network { impl Network {
fn new(nodes: HashMap<Pubkey, Node>) -> Self { fn new(nodes: HashMap<Pubkey, Node>) -> Self {
Network { Network {
nodes, nodes,
pruned_count: 0, connections_pruned: HashSet::new(),
stake_pruned: 0, stake_pruned: 0,
} }
} }
@ -192,7 +192,7 @@ fn network_simulator_pull_only(network: &mut Network) {
assert!(converged >= 0.9); assert!(converged >= 0.9);
} }
fn network_simulator(network: &mut Network) { fn network_simulator(network: &mut Network, max_convergance: f64) {
let num = network.len(); let num = network.len();
// run for a small amount of time // run for a small amount of time
let (converged, bytes_tx) = network_run_pull(network, 0, 10, 1.0); let (converged, bytes_tx) = network_run_pull(network, 0, 10, 1.0);
@ -239,7 +239,7 @@ fn network_simulator(network: &mut Network) {
bytes_tx, bytes_tx,
total_bytes total_bytes
); );
if converged > 0.9 { if converged > max_convergance {
break; break;
} }
} }
@ -270,8 +270,7 @@ fn network_run_push(network: &mut Network, start: usize, end: usize) -> (usize,
let mut bytes: usize = 0; let mut bytes: usize = 0;
let mut delivered: usize = 0; let mut delivered: usize = 0;
let mut num_msgs: usize = 0; let mut num_msgs: usize = 0;
let mut prunes: usize = 0; let mut pruned: HashSet<(Pubkey, Pubkey)> = HashSet::new();
let mut stake_pruned: u64 = 0;
for (to, msgs) in push_messages { for (to, msgs) in push_messages {
bytes += serialized_size(&msgs).unwrap() as usize; bytes += serialized_size(&msgs).unwrap() as usize;
num_msgs += 1; num_msgs += 1;
@ -297,13 +296,12 @@ fn network_run_push(network: &mut Network, start: usize, end: usize) -> (usize,
for (from, prune_set) in prunes_map { for (from, prune_set) in prunes_map {
let prune_keys: Vec<_> = prune_set.into_iter().collect(); let prune_keys: Vec<_> = prune_set.into_iter().collect();
for prune_key in &prune_keys {
pruned.insert((from, *prune_key));
}
bytes += serialized_size(&prune_keys).unwrap() as usize; bytes += serialized_size(&prune_keys).unwrap() as usize;
delivered += 1; delivered += 1;
prunes += prune_keys.len();
let stake_pruned_sum = stakes.get(&from).unwrap() * prune_keys.len() as u64;
stake_pruned += stake_pruned_sum;
network network
.get(&from) .get(&from)
@ -317,16 +315,22 @@ fn network_run_push(network: &mut Network, start: usize, end: usize) -> (usize,
.unwrap(); .unwrap();
} }
} }
(bytes, delivered, num_msgs, prunes, stake_pruned) (bytes, delivered, num_msgs, pruned)
}) })
.collect(); .collect();
for (b, d, m, p, s) in transfered { for (b, d, m, p) in transfered {
bytes += b; bytes += b;
delivered += d; delivered += d;
num_msgs += m; num_msgs += m;
prunes += p;
stake_pruned += s; for (from, to) in p {
let from_stake = stakes.get(&from).unwrap();
if network.connections_pruned.insert((from, to)) {
prunes += 1;
stake_pruned += *from_stake;
}
}
} }
if now % CRDS_GOSSIP_PUSH_MSG_TIMEOUT_MS == 0 && now > 0 { if now % CRDS_GOSSIP_PUSH_MSG_TIMEOUT_MS == 0 && now > 0 {
network_values.par_iter().for_each(|node| { network_values.par_iter().for_each(|node| {
@ -351,8 +355,8 @@ fn network_run_push(network: &mut Network, start: usize, end: usize) -> (usize,
delivered, delivered,
); );
} }
network.pruned_count = prunes;
network.stake_pruned = stake_pruned; network.stake_pruned += stake_pruned;
(total, bytes) (total, bytes)
} }
@ -450,36 +454,37 @@ fn test_star_network_pull_100() {
#[test] #[test]
fn test_star_network_push_star_200() { fn test_star_network_push_star_200() {
let mut network = star_network_create(200); let mut network = star_network_create(200);
network_simulator(&mut network); network_simulator(&mut network, 0.9);
} }
#[test] #[test]
fn test_star_network_push_rstar_200() { fn test_star_network_push_rstar_200() {
let mut network = rstar_network_create(200); let mut network = rstar_network_create(200);
network_simulator(&mut network); network_simulator(&mut network, 0.9);
} }
#[test] #[test]
fn test_star_network_push_ring_200() { fn test_star_network_push_ring_200() {
let mut network = ring_network_create(200); let mut network = ring_network_create(200);
network_simulator(&mut network); network_simulator(&mut network, 0.9);
} }
#[test] #[test]
fn test_connected_staked_network() { fn test_connected_staked_network() {
solana_logger::setup(); solana_logger::setup();
let stakes = [ let stakes = [
[1000; 5].to_vec(), [1000; 2].to_vec(),
[100; 20].to_vec(), [100; 3].to_vec(),
[10; 50].to_vec(), [10; 5].to_vec(),
[1; 125].to_vec(), [1; 15].to_vec(),
] ]
.concat(); .concat();
let mut network = connected_staked_network_create(&stakes); let mut network = connected_staked_network_create(&stakes);
network_simulator(&mut network); network_simulator(&mut network, 1.0);
let stake_sum: u64 = stakes.iter().sum(); let stake_sum: u64 = stakes.iter().sum();
let avg_stake: u64 = stake_sum / stakes.len() as u64; let avg_stake: u64 = stake_sum / stakes.len() as u64;
let avg_stake_pruned = network.stake_pruned / network.pruned_count as u64; let avg_stake_pruned = network.stake_pruned / network.connections_pruned.len() as u64;
trace!( trace!(
"connected staked network, avg_stake: {}, avg_stake_pruned: {}", "connected staked networks, connections_pruned: {}, avg_stake: {}, avg_stake_pruned: {}",
network.connections_pruned.len(),
avg_stake, avg_stake,
avg_stake_pruned avg_stake_pruned
); );
@ -500,21 +505,21 @@ fn test_star_network_large_pull() {
fn test_rstar_network_large_push() { fn test_rstar_network_large_push() {
solana_logger::setup(); solana_logger::setup();
let mut network = rstar_network_create(4000); let mut network = rstar_network_create(4000);
network_simulator(&mut network); network_simulator(&mut network, 0.9);
} }
#[test] #[test]
#[ignore] #[ignore]
fn test_ring_network_large_push() { fn test_ring_network_large_push() {
solana_logger::setup(); solana_logger::setup();
let mut network = ring_network_create(4001); let mut network = ring_network_create(4001);
network_simulator(&mut network); network_simulator(&mut network, 0.9);
} }
#[test] #[test]
#[ignore] #[ignore]
fn test_star_network_large_push() { fn test_star_network_large_push() {
solana_logger::setup(); solana_logger::setup();
let mut network = star_network_create(4002); let mut network = star_network_create(4002);
network_simulator(&mut network); network_simulator(&mut network, 0.9);
} }
#[test] #[test]
fn test_prune_errors() { fn test_prune_errors() {