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.
This commit is contained in:
Greg Fitzgerald 2019-02-23 14:03:49 -07:00
parent d26f836212
commit fdf6cae6fb
6 changed files with 46 additions and 45 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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(),

View File

@ -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

View File

@ -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