From fdf6cae6fb71c012b0ad1552c5e385b7e5b94076 Mon Sep 17 00:00:00 2001 From: Greg Fitzgerald Date: Sat, 23 Feb 2019 14:03:49 -0700 Subject: [PATCH] Use bank for leader scheduler's config This ensures GenesisBlock is always configured with the same ticks_per_slot as LeaderScheduler. This will make it easier to migrate to bank-generated schedules. --- src/blockstream.rs | 6 ++--- src/blockstream_service.rs | 9 ++++---- src/leader_scheduler.rs | 47 +++++++++++++++++++++++--------------- src/replay_stage.rs | 5 ++-- src/tvu.rs | 5 +--- tests/tvu.rs | 19 ++++++--------- 6 files changed, 46 insertions(+), 45 deletions(-) diff --git a/src/blockstream.rs b/src/blockstream.rs index 25d343288..de1131c71 100644 --- a/src/blockstream.rs +++ b/src/blockstream.rs @@ -166,7 +166,6 @@ pub struct BlockData { mod test { use super::*; use crate::entry::Entry; - use crate::leader_scheduler::LeaderSchedulerConfig; use chrono::{DateTime, FixedOffset}; use serde_json::Value; use solana_runtime::bank::Bank; @@ -179,11 +178,10 @@ mod test { // Set up bank and leader_scheduler let (mut genesis_block, _mint_keypair) = GenesisBlock::new(1_000_000); genesis_block.ticks_per_slot = 5; - let leader_scheduler_config = - LeaderSchedulerConfig::new(genesis_block.ticks_per_slot, 2, 10); + genesis_block.slots_per_epoch = 2; let bank = Bank::new(&genesis_block); - let leader_scheduler = LeaderScheduler::new_with_bank(&leader_scheduler_config, &bank); + let leader_scheduler = LeaderScheduler::new_with_window_len(10, &bank); let leader_scheduler = Arc::new(RwLock::new(leader_scheduler)); // Set up blockstream diff --git a/src/blockstream_service.rs b/src/blockstream_service.rs index 1f719e6db..938516da9 100644 --- a/src/blockstream_service.rs +++ b/src/blockstream_service.rs @@ -117,7 +117,6 @@ impl Service for BlockstreamService { mod test { use super::*; use crate::entry::Entry; - use crate::leader_scheduler::LeaderSchedulerConfig; use chrono::{DateTime, FixedOffset}; use serde_json::Value; use solana_runtime::bank::Bank; @@ -132,10 +131,12 @@ mod test { let ticks_per_slot = 5; let starting_tick_height = 1; - let (genesis_block, _mint_keypair) = GenesisBlock::new(1_000_000); + let (mut genesis_block, _mint_keypair) = GenesisBlock::new(1_000_000); + genesis_block.ticks_per_slot = ticks_per_slot; + genesis_block.slots_per_epoch = 2; + let bank = Bank::new(&genesis_block); - let leader_scheduler_config = LeaderSchedulerConfig::new(ticks_per_slot, 2, 10); - let leader_scheduler = LeaderScheduler::new_with_bank(&leader_scheduler_config, &bank); + let leader_scheduler = LeaderScheduler::new_with_window_len(10, &bank); let leader_scheduler = Arc::new(RwLock::new(leader_scheduler)); // Set up blockstream diff --git a/src/leader_scheduler.rs b/src/leader_scheduler.rs index 8c5ff7783..9778353ff 100644 --- a/src/leader_scheduler.rs +++ b/src/leader_scheduler.rs @@ -105,12 +105,21 @@ impl LeaderScheduler { } } - pub fn new_with_bank(config: &LeaderSchedulerConfig, bank: &Bank) -> Self { - let mut leader_schedule = Self::new(config); + pub fn new_with_window_len(active_window_slot_len: u64, bank: &Bank) -> Self { + let config = LeaderSchedulerConfig::new( + bank.ticks_per_slot(), + bank.slots_per_epoch(), + active_window_slot_len, + ); + let mut leader_schedule = Self::new(&config); leader_schedule.update_tick_height(bank.tick_height(), bank); leader_schedule } + pub fn new_with_bank(bank: &Bank) -> Self { + Self::new_with_window_len(DEFAULT_ACTIVE_WINDOW_NUM_SLOTS, bank) + } + pub fn tick_height_to_slot(&self, tick_height: u64) -> u64 { tick_height / self.ticks_per_slot } @@ -399,13 +408,12 @@ pub mod tests { // Allow the validators to be in the active window for the entire test let active_window_num_slots = slots_per_epoch; - // Set up the LeaderScheduler struct - let leader_scheduler_config = - LeaderSchedulerConfig::new(ticks_per_slot, slots_per_epoch, active_window_num_slots); - // Create the bank and validators, which are inserted in order of account balance let num_vote_account_tokens = 1; - let (genesis_block, mint_keypair) = GenesisBlock::new(10_000); + let (mut genesis_block, mint_keypair) = GenesisBlock::new(10_000); + genesis_block.ticks_per_slot = ticks_per_slot; + genesis_block.slots_per_epoch = slots_per_epoch; + info!("bootstrap_leader_id: {}", genesis_block.bootstrap_leader_id); let bank = Bank::new(&genesis_block); @@ -434,7 +442,8 @@ pub mod tests { ); } - let mut leader_scheduler = LeaderScheduler::new_with_bank(&leader_scheduler_config, &bank); + let mut leader_scheduler = + LeaderScheduler::new_with_window_len(active_window_num_slots, &bank); // Generate the schedule for first epoch, bootstrap_leader will be the only leader leader_scheduler.generate_schedule(0, &bank); @@ -509,8 +518,7 @@ pub mod tests { let leader_tokens = 2; let (genesis_block, _) = GenesisBlock::new_with_leader(5, leader_id, leader_tokens); let bank = Bank::new(&genesis_block); - let leader_scheduler = - LeaderScheduler::new_with_bank(&LeaderSchedulerConfig::default(), &bank); + let leader_scheduler = LeaderScheduler::new_with_bank(&bank); let slot = leader_scheduler.tick_height_to_slot(bank.tick_height()); assert_eq!(leader_scheduler.get_leader_for_slot(slot), Some(leader_id)); } @@ -645,14 +653,15 @@ pub mod tests { let active_window_num_slots = slots_per_epoch; // Create the bazzznk and validators - let (genesis_block, mint_keypair) = GenesisBlock::new( + let (mut genesis_block, mint_keypair) = GenesisBlock::new( ((((num_validators + 1) / 2) * (num_validators + 1)) + (num_vote_account_tokens * num_validators)) as u64, ); + genesis_block.ticks_per_slot = ticks_per_slot; + genesis_block.slots_per_epoch = slots_per_epoch; let bank = Bank::new(&genesis_block); - let leader_scheduler_config = - LeaderSchedulerConfig::new(ticks_per_slot, slots_per_epoch, active_window_num_slots); - let mut leader_scheduler = LeaderScheduler::new_with_bank(&leader_scheduler_config, &bank); + let mut leader_scheduler = + LeaderScheduler::new_with_window_len(active_window_num_slots, &bank); let mut validators = vec![]; let last_id = genesis_block.last_id(); @@ -715,11 +724,13 @@ pub mod tests { // Check that the generate_schedule() function is being called by the // update_tick_height() function at the correct entry heights. - let (genesis_block, _) = GenesisBlock::new(10_000); + let (mut genesis_block, _) = GenesisBlock::new(10_000); + genesis_block.ticks_per_slot = ticks_per_slot; + genesis_block.slots_per_epoch = slots_per_epoch; + let bank = Bank::new(&genesis_block); - let leader_scheduler_config = - LeaderSchedulerConfig::new(ticks_per_slot, slots_per_epoch, active_window_num_slots); - let mut leader_scheduler = LeaderScheduler::new_with_bank(&leader_scheduler_config, &bank); + let mut leader_scheduler = + LeaderScheduler::new_with_window_len(active_window_num_slots, &bank); info!( "bootstrap_leader_id: {:?}", genesis_block.bootstrap_leader_id diff --git a/src/replay_stage.rs b/src/replay_stage.rs index 5c79b29a9..543ec0690 100644 --- a/src/replay_stage.rs +++ b/src/replay_stage.rs @@ -777,8 +777,7 @@ mod test { let genesis_block = GenesisBlock::new(10_000).0; let bank = Arc::new(Bank::new(&genesis_block)); - let leader_scheduler_config = LeaderSchedulerConfig::default(); - let leader_scheduler = LeaderScheduler::new_with_bank(&leader_scheduler_config, &bank); + let leader_scheduler = LeaderScheduler::new_with_bank(&bank); let leader_scheduler = Arc::new(RwLock::new(leader_scheduler)); let voting_keypair = Some(Arc::new(Keypair::new())); let res = ReplayStage::process_entries( @@ -805,7 +804,7 @@ mod test { } let bank = Arc::new(Bank::new(&genesis_block)); - let leader_scheduler = LeaderScheduler::new_with_bank(&leader_scheduler_config, &bank); + let leader_scheduler = LeaderScheduler::new_with_bank(&bank); let leader_scheduler = Arc::new(RwLock::new(leader_scheduler)); let res = ReplayStage::process_entries( entries.clone(), diff --git a/src/tvu.rs b/src/tvu.rs index 97916786e..440f4e883 100644 --- a/src/tvu.rs +++ b/src/tvu.rs @@ -206,7 +206,6 @@ pub mod tests { use super::*; use crate::blocktree::get_tmp_ledger_path; use crate::cluster_info::{ClusterInfo, Node}; - use crate::leader_scheduler::LeaderSchedulerConfig; use crate::storage_stage::STORAGE_ROTATE_TEST_COUNT; use solana_runtime::bank::Bank; use solana_sdk::genesis_block::GenesisBlock; @@ -228,9 +227,7 @@ pub mod tests { entry_height: 0, last_entry_id: Hash::default(), }]; - let leader_scheduler_config = LeaderSchedulerConfig::default(); - let leader_scheduler = - LeaderScheduler::new_with_bank(&leader_scheduler_config, &bank_forks.working_bank()); + let leader_scheduler = LeaderScheduler::new_with_bank(&bank_forks.working_bank()); let leader_scheduler = Arc::new(RwLock::new(leader_scheduler)); //start cluster_info1 diff --git a/tests/tvu.rs b/tests/tvu.rs index 3f603e432..672833331 100644 --- a/tests/tvu.rs +++ b/tests/tvu.rs @@ -7,7 +7,6 @@ use solana::entry::next_entry_mut; use solana::entry::EntrySlice; use solana::gossip_service::GossipService; use solana::leader_scheduler::LeaderScheduler; -use solana::leader_scheduler::LeaderSchedulerConfig; use solana::packet::index_blobs; use solana::rpc_subscriptions::RpcSubscriptions; use solana::service::Service; @@ -76,14 +75,13 @@ fn test_replay() { r_responder, ); - // TODO: Fix this test so it always works with the default - // LeaderSchedulerConfig configuration - let mut leader_scheduler_config = LeaderSchedulerConfig::default(); - leader_scheduler_config.ticks_per_slot = 64; - let ticks_per_slot = leader_scheduler_config.ticks_per_slot; - let starting_balance = 10_000; - let (genesis_block, mint_keypair) = GenesisBlock::new(starting_balance); + let (mut genesis_block, mint_keypair) = GenesisBlock::new(starting_balance); + + // TODO: Fix this test so it always works with the default GenesisBlock configuration + genesis_block.ticks_per_slot = 64; + + let ticks_per_slot = genesis_block.ticks_per_slot; let tvu_addr = target1.info.tvu; let mut cur_hash = Hash::default(); @@ -95,10 +93,7 @@ fn test_replay() { }]; let bank = bank_forks.working_bank(); - let leader_scheduler = Arc::new(RwLock::new(LeaderScheduler::new_with_bank( - &leader_scheduler_config, - &bank, - ))); + let leader_scheduler = Arc::new(RwLock::new(LeaderScheduler::new_with_bank(&bank))); assert_eq!(bank.get_balance(&mint_keypair.pubkey()), starting_balance); // start cluster_info1